1. 面向对象编程基础概念
1.1 传统编程与面向对象编程的本质区别
在传统的过程式编程中,我们关注的是"怎么做"——即编写一系列按顺序执行的指令。这种方式在处理简单任务时很有效,但随着程序复杂度增加,数据和行为的分离会导致代码难以维护。
面向对象编程(OOP)则将现实世界中的事物抽象为对象,每个对象都有自己的状态(属性)和行为(方法)。这种思维方式更接近人类认知世界的方式,使得我们可以:
- 将复杂系统分解为相互协作的对象
- 通过封装隐藏内部实现细节
- 通过继承实现代码复用
- 通过多态实现接口统一
实际开发经验:在大型项目中,面向对象的设计能显著降低模块间的耦合度。我曾接手过一个用过程式编写的库存管理系统,当需要添加新功能时,往往要修改多个地方的代码。重构为面向对象设计后,新功能的添加变得更有条理。
1.2 类与对象的关系解析
类(Class)是创建对象的模板,它定义了:
- 属性(字段):描述对象特征的变量
- 方法:对象可以执行的操作
- 事件:对象可以触发的通知
对象(Object)则是类的具体实例。理解这个关系的关键在于:
csharp复制// 类定义 - 相当于建筑设计图
public class Car
{
public string Model { get; set; }
public void StartEngine() { /*...*/ }
}
// 对象实例 - 根据图纸建造的实际房屋
Car myCar = new Car();
Car yourCar = new Car();
每个对象都有独立的内存空间,修改一个对象的属性不会影响其他对象。
1.3 面向对象的四大支柱
-
封装:隐藏内部实现细节,只暴露必要的接口
- 通过访问修饰符(public/private等)控制可见性
- 示例:汽车不需要暴露燃油喷射细节,只需提供启动方法
-
继承:子类可以继承父类的特征和行为
- 实现代码复用和层次化设计
- 示例:电动车继承自汽车基类,共享车轮等属性
-
多态:同一操作作用于不同对象会产生不同行为
- 通过方法重写和接口实现
- 示例:不同支付方式(支付宝/微信)都实现Pay()方法
-
抽象:提取共性特征形成抽象类或接口
- 定义规范而不关心具体实现
- 示例:定义IPayment接口,各支付平台具体实现
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. C#中的类设计与实现
2.1 定义类的完整语法结构
一个规范的C#类应包含以下要素:
csharp复制[访问修饰符] class 类名 [: 基类] [, 接口列表]
{
// 字段
[访问修饰符] 数据类型 字段名;
// 属性
[访问修饰符] 数据类型 属性名 { get; set; }
// 构造函数
[访问修饰符] 类名(参数列表) { ... }
// 方法
[访问修饰符] 返回值类型 方法名(参数列表) { ... }
// 事件
[访问修饰符] event 委托类型 事件名;
}
2.2 属性与字段的最佳实践
字段(field)是类中存储数据的变量,而属性(property)是对字段的封装:
csharp复制private string _name; // 私有字段
public string Name // 属性
{
get => _name;
set
{
if (!string.IsNullOrEmpty(value))
_name = value;
else
throw new ArgumentException("姓名不能为空");
}
}
现代C#中更推荐使用自动属性:
csharp复制public string Name { get; set; } // 编译器会自动生成后备字段
开发技巧:对于需要验证的属性,可以使用init访问器防止对象创建后被修改:
csharp复制public string Id { get; init; } // 只能在构造函数或对象初始化器中设置
2.3 方法设计的专业建议
- 单一职责原则:每个方法只做一件事
- 合理参数设计:参数不超过5个,复杂参数考虑使用对象封装
- 明确命名:方法名应清晰表达其功能
- 异常处理:合理处理可能出现的异常情况
示例:
csharp复制public class OrderService
{
public async Task<OrderResult> PlaceOrderAsync(OrderRequest request)
{
// 参数验证
if (request == null) throw new ArgumentNullException(nameof(request));
try
{
// 业务逻辑...
return new OrderResult { Success = true };
}
catch (Exception ex)
{
// 日志记录
_logger.LogError(ex, "下单失败");
return new OrderResult { Success = false, Error = ex.Message };
}
}
}
3. 对象集合的高级应用
3.1 List的性能优化策略
虽然List
-
预设容量:如果知道大概元素数量,构造时指定容量避免多次扩容
csharp复制var bigList = new List<int>(10000); // 预设容量 -
批量操作:使用AddRange替代循环Add
csharp复制// 低效 foreach (var item in source) list.Add(item); // 高效 list.AddRange(source); -
查找优化:对于频繁查找的场景,考虑使用Dictionary或HashSet
3.2 LINQ的深入应用
LINQ是.NET中强大的查询语言,掌握其高级用法能极大提升开发效率:
复杂查询示例
csharp复制var results = products
.Where(p => p.Price > 100)
.GroupBy(p => p.Category)
.Select(g => new {
Category = g.Key,
Count = g.Count(),
AvgPrice = g.Average(p => p.Price),
Items = g.OrderByDescending(p => p.Price).Take(3)
})
.OrderByDescending(x => x.AvgPrice);
性能注意事项
1
