放弃重载有利于Extension方法

时间:2011-04-07 19:14:39

标签: c# c#-4.0 extension-methods api-design

既然我们在C#中有扩展方法,那么为了传递默认值,在实现任何类时是否还有任何重要意义? 为什么在重载时可以使扩展方法污染类实现? 重载的任何优点(用于传递默认值)?

我正在计算默认参数的选项,因为它强制参数的特定排序(即默认值可以到底)以及默认值在客户端代码中编译并且服务包可能因此而破坏的事实

3 个答案:

答案 0 :(得分:6)

  

既然我们在C#中有扩展方法,那么在实现任何类的传递默认值时是否还有任何重点?

我会使用optional arguments而不是扩展方法来删除重载。

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

但是,有时使用重载方法和构造函数比添加可选参数更好 - 与您已经提到的问题分开。这包括:

  • 使用不了解可选参数的语言。 C#和VB.Net并不是唯一的.NET语言。
  • 有时可选参数不会削减它 - 例如,你经常需要一个真正的默认构造函数和可选参数,而它们在手写代码时看起来像是这样,在反射/序列化/等方面表现得非常不同

答案 1 :(得分:2)

问题不应该是“重载是否有优势”,而是“延伸方法有哪些优势使它们优于过载?”在我看来,扩展方法的缺点远远超过任何感知的优势。事实上,当你设计一个类时,我无法想出扩展方法提供的任何优势。

例如,假设您的类具有此方法:

public int Frob(int count)

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

当然,在.NET 4.0中,您可以使用默认参数执行此操作,但正如您所说,默认参数并不总是一个选项,因为它们必须是最后一个。因此,如果没有默认参数,您可以选择1)创建重载;或2)创建扩展方法。

创建过载非常简单。创建扩展方法需要静态类和静态方法,并引入无意隐藏的可能性 - 所有并发症都没有任何好处。为什么使用扩展方法来模拟重载,只需编写dang重载并完成它?

如果您无法修改类,那么扩展方法是显而易见的选择。但是如果选择,请使用旨在提供所需功能的功能。

答案 2 :(得分:0)

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