函数式 vs 面向对象编程在 C# 中:2025 年如何选择?

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:一枚硬币的两面



想象一下,你在建造一栋房子。你可以使用现成的积木(类、对象、继承)来搭建复杂的结构——这就是面向对象编程(OOP)。或者,你可以像数学家一样思考:“我获取数据,对其应用纯函数,得到新结果,而不改变任何东西”——这就是函数式编程。



在 C# 中,这两种范式奇妙地共存。如果你使用这门语言,迟早会问自己:“如果我做错了怎么办?是不是应该多用 LINQ,少用类?”



在本文中,我们不会争论哪种更好。我们将弄清楚C# 中函数式方法与面向对象编程有何不同,每种方法何时真正有帮助,何时反而有害。是的,会有很多代码。开始吧!



1. C# 中的面向对象编程:行之有效的经典



面向对象编程关乎状态和行为。你有一个类,它存储数据(字段、属性)以及修改这些数据的方法。



示例:一个管理电商订单的应用程序。



public class Order{    public int Id { get; set; }    public List<string> Items { get; private set; }    public decimal TotalPrice { get; private set; }

public Order(int id) { Id = id; Items = new List<string>(); TotalPrice = 0; }

public void AddItem(string itemName, decimal price) { Items.Add(itemName); TotalPrice += price; }

public void ApplyDiscount(decimal percent) { TotalPrice -= TotalPrice * (percent / 100); }}


我们看到了什么?封装:TotalPrice 不能直接修改——只能通过方法修改。状态随时间变化:我们添加商品、应用折扣。这是纯粹的面向对象编程。



C# 中面向对象编程的优点

  • 清晰的现实世界模型:订单、客户、商品——一切都像真实生活。
  • 通过继承和接口实现代码复用。
  • 通过拆分为小对象管理复杂性。


面向对象编程的缺点

  • 副作用:一个方法可能改变状态,你很容易失去控制。
  • 测试复杂:需要创建对象、模拟依赖。
  • 冗余:有时写一个函数比创建一个完整的类更简单。


2. C# 中的函数式方法:LINQ 及其他



函数式编程关乎纯函数(无副作用)和数据不可变性。在 C# 中,这一点在 LINQ、lambda 表达式和集合操作中尤为明显。



让我们用函数式方法解决同一个问题——管理订单。



// 不可变记录public record Order(int Id, List<string> Items, decimal TotalPrice);

public static class OrderFunctions{ public static Order AddItem(Order order, string item, decimal price) { var newItems = order.Items.Append(item).ToList(); return order with { Items = newItems, TotalPrice = order.TotalPrice + price }; }

public static Order ApplyDiscount(Order order, decimal percent) { return order with { TotalPrice = order.TotalPrice * (1 - percent / 100) }; }}

// 使用var order = new Order(1, new List<string>(), 0);order = OrderFunctions.AddItem(order, "笔记本电脑", 50000);order = OrderFunctions.ApplyDiscount(order, 10);


注意到了吗?我们没有修改原始对象。每次使用 with 创建一个新实例。这避免了意外修改。



而

博客

书籍推荐