C# 类是面向对象编程(OOP)中的核心概念之一,用于定义对象的模板或蓝图,包含数据成员(字段、属性)和函数成员(方法、事件等)。类提供了封装机制,将数据和操作数据的方法组合在一起,隐藏内部实现细节,只对外提供有限的接口,从而提高代码的可维护性和安全性。
1. 类的本质
- 引用类型:对象存储在堆(Heap)中,变量持有对象引用。
- 面向对象三大特性:
封装:通过访问修饰符(public/private/protected)控制成员可见性。
继承:单继承(class Derived : Base),支持多层继承。
多态:通过虚方法(virtual)、抽象方法(abstract)和重写(override)实现。
2. 类的基本结构
[访问修饰符] class 类名 [: 基类] [, 接口1, 接口2...]
{
// 成员定义
private string _field; // 字段
public string Property { get; set; } // 属性
public void Method() { } // 方法
public 类名() { } // 构造函数
~类名() { } // 析构函数(极少使用)
}
3. 核心成员类型
成员类型 | 说明 | 示例 |
---|---|---|
字段 | 存储数据的变量,通常设为 | private private int _id; |
属性 | 封装字段,控制读写逻辑 | public string Name { get; private set; } |
方法 | 定义对象行为 | public void Save() { … } |
构造函数 | 初始化对象,支持重载 | public Person(string name) { … } |
事件 | 用于发布-订阅模式 | public event EventHandler OnClick; |
索引器 | 使对象支持类似数组的访问 | public int this[int i] { get; set; } |
4. 关键特性
- 静态成员:类级别共享,通过 static 关键字定义。
public static int Count; // 静态字段
public static void Log() { } // 静态方法
- 抽象类:用 abstract 修饰,不能实例化,用于定义通用逻辑。
public abstract class Shape { public abstract double Area(); }
- 密封类:用 sealed 修饰,禁止继承。
public sealed class StringUtils { }
- 分部类:用 partial 拆分类到多个文件。
// File1.cs
public partial class Data { }
// File2.cs
public partial class Data { }
5. 类 vs 结构体(Struct)
特性 | 类(Class) | 结构体(Struct) |
---|---|---|
内存分配 | 堆内存 | 栈内存(通常) |
赋值行为 | 复制引用(修改副本影响原对象) | 复制值(副本独立) |
继承 | 支持 | 不支持 |
默认构造器 | 有无参构造器 | C# 10 前不能显式定义无参构造器 |
适用场景 | 复杂对象、需继承或引用语义 | 小型数据(如坐标点、颜色值) |
6. 最佳实践
- 封装数据:字段设为 private,通过属性暴露必要访问。
- 避免过深继承:优先使用组合而非继承。
- 不可变设计:对线程安全的数据使用 readonly 字段。
public class ImmutablePoint
{
public readonly int X;
public readonly int Y;
public ImmutablePoint(int x, int y) => (X, Y) = (x, y);
}
- 资源释放:实现 IDisposable 接口管理非托管资源,而非依赖析构函数。
public class FileReader : IDisposable
{
private Stream _stream;
public void Dispose() => _stream?.Close();
}
7. 典型类示例
public class BankAccount
{
// 字段
private decimal _balance;
private readonly string _owner;
// 属性
public decimal Balance => _balance; // 只读属性
// 构造函数
public BankAccount(string owner, decimal initialBalance)
{
_owner = owner;
_balance = initialBalance;
}
// 方法
public void Deposit(decimal amount)
{
if (amount <= 0)
throw new ArgumentException("Deposit amount must be positive");
_balance += amount;
}
// 重写 ToString
public override string ToString() => $"{_owner}'s account: {_balance:C}";
}
// 使用
var account = new BankAccount("Alice", 1000);
account.Deposit(500);
Console.WriteLine(account); // 输出: Alice's account: $1,500.00
掌握类的核心设计原则,可以高效构建可维护的面向对象程序。根据场景选择类或结构体,合理使用封装、继承和多态,是提升代码质量的关键。