类与对象
翻译整理自 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 等让数据建模极其高效。