既然我们在C#中有扩展方法,那么为了传递默认值,在实现任何类时是否还有任何重要意义? 为什么在重载时可以使扩展方法污染类实现? 重载的任何优点(用于传递默认值)?
我正在计算默认参数的选项,因为它强制参数的特定排序(即默认值可以到底)以及默认值在客户端代码中编译并且服务包可能因此而破坏的事实
答案 0 :(得分:6)
既然我们在C#中有扩展方法,那么在实现任何类的传递默认值时是否还有任何重点?
我会使用optional arguments而不是扩展方法来删除重载。
扩展方法有很多缺点 - 它们对私有成员的访问权限较少,它们具有可发现性问题(因为它们是在单独的类中定义的)等等。
但是,有时使用重载方法和构造函数比添加可选参数更好 - 与您已经提到的问题分开。这包括:
答案 1 :(得分:2)
问题不应该是“重载是否有优势”,而是“延伸方法有哪些优势使它们优于过载?”在我看来,扩展方法的缺点远远超过任何感知的优势。事实上,当你设计一个类时,我无法想出扩展方法提供的任何优势。
例如,假设您的类具有此方法:
public int Frob(int count)
但最常见的预期用例是客户端使用count
值为1来调用它。因此,您要创建一个不需要该参数的Frob()
方法。
当然,在.NET 4.0中,您可以使用默认参数执行此操作,但正如您所说,默认参数并不总是一个选项,因为它们必须是最后一个。因此,如果没有默认参数,您可以选择1)创建重载;或2)创建扩展方法。
创建过载非常简单。创建扩展方法需要静态类和静态方法,并引入无意隐藏的可能性 - 所有并发症都没有任何好处。为什么使用扩展方法来模拟重载,只需编写dang重载并完成它?
如果您无法修改类,那么扩展方法是显而易见的选择。但是如果选择,请使用旨在提供所需功能的功能。
答案 2 :(得分:0)
除了Reed Copsey的回答:扩展方法按照定义是静态的,并且静态在单元测试和模拟方面通常被认为是邪恶的。这就是为什么我个人尽量避免使用扩展方法。