我想知道C#
中扩展方法背后的设计动机是什么答案 0 :(得分:11)
它允许您在不编辑原始代码的情况下为现有代码库创建新功能。
http://weblogs.asp.net/scottgu/archive/2007/03/13/new-orcas-language-feature-extension-methods.aspx
“扩展方法允许开发人员将新方法添加到现有CLR类型的公共协定中,而无需对其进行子类化或重新编译原始类型。扩展方法有助于融合”duck typing“支持的灵活性在动态语言中很流行,具有强类型语言的性能和编译时验证。 扩展方法支持各种有用的场景,并有助于使用.NET引入的真正强大的LINQ查询框架作为“Orcas”版本的一部分。“
答案 1 :(得分:3)
它们存在的主要原因是能够以某种方式向类型添加功能而不继承它。
这需要提供Where
,Select
,...方法,以便在LINQ中使用没有一个的集合。
答案 2 :(得分:2)
它通过后门提供多重继承。
支持从许多类继承的C ++等语言,不需要扩展方法。但是多重继承有很多问题,因此现代语言已经放弃了它。但是,扩展方法是多重继承有用的用例。 C#设计者不是重新引入多重继承,而是创建了扩展方法(这是解决问题的一个非常巧妙的解决方案)。
答案 3 :(得分:1)
我们经常为自己编写有用的小实用程序静态类,它们对类型执行常见功能。我知道有很多次我希望我可以简单地继承一个类来添加一个功能但该类是密封的。我很高兴,虽然他们是封闭的,无根据的继承是一件坏事。
扩展方法允许这些静态方法看起来像是该类型的新实例方法,从而使代码看起来更直观。
它们还具有不污染该类型的实际成员名称空间并允许您通过using
关键字选择加入它们的优点。
答案 4 :(得分:0)
扩展方法的存在很可能是由于Microsoft需要在不更改接口的情况下向IEnumerable
添加功能。如果他们向接口添加了方法,那么IEnumerable
(包括Microsoft的)的每个现有实现都将不再编译。
更改IEnumerable
的替代方法是创建一个实用程序类(名为Enumerable
),该实用程序类具有对IEnumerable
实例执行转换的方法。除了用户体验与从现有IEnumerable
实例调用方法不同之外,这是有效的。例如,比较以下等效语句。
IEnumerable<string> strings = myIntList.Select(num => num.ToString())
.Where(num => num.StartsWith('T'));
IEnumerable<string> strings =
Enumerable.Where(
Enumerable.Select(myIntList, num => num.ToString()),
num => num.StartsWith('T'));
为了实现两全其美,C#编译器团队添加了对扩展方法的支持,允许使用特殊语法创建Enumerable
类,并保持将方法添加到{{1开头。