类与对象

翻译整理自 Classes 与 Properties。

1. 类定义

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }

    public void Introduce() => Console.WriteLine($"I'm {Name}, {Age}");
}

var p = new Person("Alice", 30);
p.Introduce();

2. 自动属性

public class Book
{
    public string Title { get; set; }
    public string Author { get; set; } = "Anonymous";
    public int Year { get; private set; } = 2020;     // 外只读
}

3. init 设置器(C# 9+)

public class Book
{
    public string Title { get; init; }
}
var b = new Book { Title = "C# in Depth" };
// b.Title = "X";   // ❌ init 后不可改

4. required 关键字(C# 11+)

public class User
{
    public required string Name { get; set; }
    public int? Age { get; set; }
}
var u = new User { Name = "Bob" };   // 不写 Name 编译错误

5. 主构造函数(C# 12+)

public class Point(double x, double y)
{
    public double X => x;
    public double Y => y;
    public double Distance() => Math.Sqrt(x * x + y * y);
}

6. 静态成员

public class Counter
{
    public static int Count { get; private set; }
    static Counter() { Count = 0; }
    public Counter() { Count++; }
}

// 扩展方法(静态类)
public static class StringExt
{
    public static string Repeat(this string s, int n)
        => string.Concat(Enumerable.Repeat(s, n));
}
"ab".Repeat(3);   // "ababab"

7. 构造与析构

public class Resource : IDisposable
{
    public Resource() { /* 构造 */ }
    ~Resource() { /* 终结器,慎用 */ }

    public void Dispose() { GC.SuppressFinalize(this); }
}

C# 几乎不用终结器;实现 IDisposable 配合 using 是惯例。

8. 嵌套类

public class Outer
{
    public class Inner { }
}

9. 部分类 partial

// file1.cs
public partial class User { public string Name { get; set; } }

// file2.cs
public partial class User { public int Age { get; set; } }

10. 命名空间与文件

C# 10+ 支持文件作用域命名空间:

namespace MyApp.Services;

public class UserService { }

11. 不可变类型

public readonly struct Vector(double x, double y)
{
    public double X => x;
    public double Y => y;
}

或 record:

public record Point(int X, int Y);

12. 方法重载

public int  Abs(int x)  => x < 0 ? -x : x;
public long Abs(long x) => x < 0 ? -x : x;
public double Abs(double x) => x < 0 ? -x : x;

小结

C# 类的语法清晰现代,自动属性、init、required、record 等让数据建模极其高效。