放弃重载,转而使用扩展方法

本文关键字:扩展 方法 重载 放弃 | 更新日期: 2023-09-27 17:49:30

现在我们在c#中有了扩展方法,在任何类的实现中保留重载来传递默认值还有什么意义吗?当重载可以作为扩展方法时,为什么要污染类的实现?重载(传递默认值)有什么好处吗?

我计算了默认参数的选项,因为它强制参数的特定顺序(即默认值可以在末尾),并且默认值在客户端代码中编译,并且服务包可能因此而中断。

放弃重载,转而使用扩展方法

现在我们在c#中有了扩展方法,在任何类的实现中保留重载来传递默认值还有什么意义吗?

我会使用可选参数而不是扩展方法来移除重载。

扩展方法有很多缺点——它们对私有成员的访问较少,它们有可发现性问题(因为它们是在单独的类上定义的),等等。

然而,有时使用重载方法和构造函数比添加可选参数要好——这与前面提到的问题无关。这包括:

  • 使用不理解可选参数的语言。c#和VB。. Net不是唯一的。Net语言。
  • 有时候可选参数并不能解决问题——例如,你经常需要一个真正的默认构造函数,而可选参数虽然在手写代码时看起来很像,但在面对反射/序列化等问题时却表现得非常不同。

问题不应该是"重载是否有优势",而应该是"扩展方法优于重载的优势是什么?"在我看来,扩展方法的缺点远远大于它的优点。事实上,当你设计一个类时,我想不出扩展方法能提供什么优势。

假设,例如,你的类有这个方法:

public int Frob(int count)

但是最常见的预期用例是客户端使用count值为1来调用它。因此,您想要创建一个不需要该参数的Frob()方法。

当然,在。net 4.0中,你可以使用默认参数来实现这一点,但正如你所说,默认参数并不总是一个选项,因为它们必须放在最后。因此,如果没有默认参数,您可以选择1)创建重载;或者2)创建一个扩展方法。

创建重载非常简单。创建一个扩展方法需要一个静态类和一个静态方法,并引入了无意隐藏的可能性——所有的复杂性都没有带来任何好处。为什么要使用扩展方法来模拟重载,而不是直接编写重载并完成重载呢?

如果无法修改类,那么扩展方法是显而易见的选择。但是,如果有选择,请使用为提供所需功能而设计的特性。

除了Reed Copsey的回答:扩展方法根据定义是静态的,而静态在单元测试和模拟方面通常被认为是邪恶的。这就是为什么我个人尽量避免使用扩展方法的原因。