资讯动态

C#类详解:面向对象编程的核心构建块

发布时间:2026/9/12 22:24:17 来源:尧图企业网站定制
1. 类的基本概念与核心特性在C#编程语言中类class是面向对象编程OOP的基础构建块它定义了一组相关数据和行为的蓝图。类本质上是一种自定义数据类型它封装了字段数据成员和方法函数成员形成一个逻辑单元。理解类的概念对于掌握C#编程至关重要因为.NET框架本身就是建立在大量相互关联的类库之上的。类的核心特性包括封装性将数据和行为捆绑在一起并控制外部对内部实现的访问继承性允许创建层次结构子类可以继承父类的特征多态性同一操作在不同类中有不同实现方式抽象性可以定义抽象类和接口只声明不实现在C#中声明类的基本语法非常简单[访问修饰符] class 类名 { // 字段数据成员 // 属性 // 方法 // 事件 // 构造函数 // 析构函数 // 索引器 // 运算符 // 嵌套类型 }2. 类的成员构成详解2.1 字段与属性字段是类中存储数据的变量而属性则是字段的访问器提供了对字段的安全访问机制。在C#中我们通常不会直接暴露字段而是通过属性来访问public class Person { // 私有字段通常以下划线开头 private string _name; // 公共属性 public string Name { get { return _name; } set { if(string.IsNullOrEmpty(value)) throw new ArgumentException(姓名不能为空); _name value; } } // 自动实现的属性编译器会自动生成后台字段 public int Age { get; set; } }属性提供了数据验证、计算属性等功能是C#中实现封装的重要手段。从C# 7.0开始我们还可以使用更简洁的表达方式public string Name { get _name; set _name value ?? throw new ArgumentNullException(nameof(value)); }2.2 方法与构造函数方法是类中定义行为的成员。构造函数是一种特殊方法在创建类实例时自动调用public class Rectangle { // 字段 private double _width; private double _height; // 构造函数 public Rectangle(double width, double height) { _width width; _height height; } // 方法 public double CalculateArea() { return _width * _height; } // 静态方法 public static Rectangle CreateSquare(double side) { return new Rectangle(side, side); } }C#支持方法重载相同方法名不同参数、可选参数、命名参数等特性。从C# 8.0开始还支持默认接口方法。2.3 其他类成员类还可以包含以下成员事件用于实现观察者模式索引器使对象可以像数组一样被索引运算符重载定义类实例上的运算符行为嵌套类型在类内部定义的类型3. 类的访问控制与修饰符3.1 访问修饰符C#提供了多种访问修饰符来控制类及其成员的可见性修饰符可访问性public无限制访问private仅限包含类内部protected包含类和派生类internal同一程序集内protected internal同一程序集或派生类private protected同一程序集中的派生类3.2 其他重要修饰符static声明静态成员属于类而非实例readonly声明只能在声明时或构造函数中赋值的字段const编译时常量sealed阻止类被继承abstract抽象类不能实例化partial允许类定义分散在多个文件中virtual/override支持多态行为4. 类的继承与多态4.1 继承基础继承是OOP的核心概念之一C#使用单继承模型一个类只能直接继承一个父类public class Shape { public virtual void Draw() { Console.WriteLine(绘制形状); } } public class Circle : Shape { public override void Draw() { Console.WriteLine(绘制圆形); } }4.2 多态实现多态允许通过基类引用调用派生类的方法Shape shape new Circle(); shape.Draw(); // 输出绘制圆形C#实现多态主要通过虚方法virtual/override抽象方法abstract接口interface4.3 接口与抽象类接口定义契约而不提供实现抽象类可以包含部分实现public interface IDrawable { void Draw(); } public abstract class GraphicObject : IDrawable { public abstract void Draw(); public void Move(int x, int y) { Console.WriteLine($移动到位置({x}, {y})); } }5. 类的实际应用与高级特性5.1 泛型类C#支持泛型类可以创建类型安全的集合和算法public class GenericListT { private T[] items; private int count; public GenericList(int capacity) { items new T[capacity]; } public void Add(T item) { if(count items.Length) Array.Resize(ref items, items.Length * 2); items[count] item; } public T this[int index] { get items[index]; set items[index] value; } }5.2 扩展方法扩展方法允许向现有类添加方法而无需修改原始类public static class StringExtensions { public static bool IsNullOrWhiteSpace(this string value) { return string.IsNullOrEmpty(value) || value.Trim().Length 0; } } // 使用 string test ; if(test.IsNullOrWhiteSpace()) { Console.WriteLine(字符串为空或空白); }5.3 记录类C# 9.0记录record是一种特殊的类主要用于存储数据public record Person(string FirstName, string LastName); // 使用 var person1 new Person(张, 三); var person2 person1 with { LastName 四 };记录类自动实现值相等性比较、ToString()等方法适合不可变数据模型。5.4 模式匹配C# 7.0C#增强了模式匹配能力可以更简洁地处理类层次结构public static double CalculateArea(object shape) { return shape switch { Circle c Math.PI * c.Radius * c.Radius, Rectangle r r.Width * r.Height, _ throw new ArgumentException(未知形状) }; }6. 类的最佳实践与常见问题6.1 设计原则单一职责原则一个类只应有一个引起变化的原因开闭原则对扩展开放对修改关闭里氏替换原则派生类应该能够替换基类接口隔离原则客户端不应被迫依赖不使用的接口依赖倒置原则依赖抽象而非具体实现6.2 常见陷阱过度使用继承优先考虑组合而非继承忽略对象生命周期特别是涉及非托管资源时不恰当的访问级别过度暴露内部实现细节忽略相等性比较特别是用作字典键或集合元素时线程安全问题共享状态需要同步机制6.3 性能考量避免过度细分小类导致的调用开销考虑使用结构体struct替代小型不可变类注意装箱/拆箱操作对性能的影响合理使用对象池管理频繁创建销毁的对象7. 类在实际项目中的应用示例7.1 WPF中的MVVM模式public class MainViewModel : INotifyPropertyChanged { private string _userName; public string UserName { get _userName; set { if(_userName ! value) { _userName value; OnPropertyChanged(); OnPropertyChanged(nameof(Greeting)); } } } public string Greeting $你好, {UserName}; public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged([CallerMemberName] string propertyName null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }7.2 数据库访问层public abstract class RepositoryBaseT where T : class { protected readonly DbContext _context; protected RepositoryBase(DbContext context) { _context context; } public virtual async TaskT GetByIdAsync(int id) { return await _context.SetT().FindAsync(id); } public virtual async Task AddAsync(T entity) { await _context.SetT().AddAsync(entity); await _context.SaveChangesAsync(); } }7.3 多线程编程public class ThreadSafeQueueT { private readonly QueueT _queue new QueueT(); private readonly object _lock new object(); public void Enqueue(T item) { lock(_lock) { _queue.Enqueue(item); Monitor.Pulse(_lock); } } public T Dequeue() { lock(_lock) { while(_queue.Count 0) Monitor.Wait(_lock); return _queue.Dequeue(); } } }8. 类在C#生态系统中的演进C#语言版本迭代不断为类添加新特性C# 2.0泛型、静态类、分部类C# 3.0自动属性、对象初始化器、扩展方法C# 4.0动态类型、命名参数/可选参数C# 5.0异步方法async/awaitC# 6.0表达式体成员、null条件运算符C# 7.0模式匹配、本地函数C# 8.0默认接口方法、可空引用类型C# 9.0记录类、init-only属性C# 10.0记录结构、全局using指令C# 11.0泛型数学支持、required成员理解这些演进有助于编写更现代、更简洁的C#代码。例如现代C#中类的声明可以非常简洁public record Person(string Name, int Age) { public string Greeting $你好我是{Name}今年{Age}岁; }

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价