【发布时间】:2010-10-02 22:57:25
【问题描述】:
我想知道 C# 中扩展方法背后的设计动机是什么
【问题讨论】:
我想知道 C# 中扩展方法背后的设计动机是什么
【问题讨论】:
它允许您为现有代码库创建新功能,而无需编辑原始代码。
http://weblogs.asp.net/scottgu/archive/2007/03/13/new-orcas-language-feature-extension-methods.aspx
“扩展方法允许开发人员向现有 CLR 类型的公共契约添加新方法,而无需对其进行子类化或重新编译原始类型。扩展方法有助于融合“鸭子类型”支持的灵活性今天在动态语言中流行,具有强类型语言的性能和编译时验证。 扩展方法支持各种有用的场景,并帮助实现真正强大的 LINQ 查询框架,该框架作为“Orcas”版本的一部分随 .NET 一起引入。”
【讨论】:
它们存在的主要原因是能够以某种方式将特性添加到一个类型而不从它继承。
这是提供Where、Select、...方法所必需的,以便在 LINQ 中为没有集合的集合使用。
【讨论】:
它通过后门提供多重继承。
C++等It语言支持从多个类继承,不需要扩展方法。然而多重继承有很多问题,所以现代语言已经放弃了它。然而,扩展方法是多继承有用的用例。不过,C# 设计者并没有重新引入多重继承,而是创建了扩展方法(这是解决问题的一个非常巧妙的解决方案)。
【讨论】:
通常我们最终会为自己编写有用的小实用静态类,这些静态类在一个类型上执行一个通用功能。我知道有很多次我希望我可以简单地继承一个类来添加一个特性,但是那个类是密封的。我很高兴虽然他们被封印了,但毫无根据的继承是一件坏事。
扩展方法允许这些静态方法看起来是该类型的新实例方法,从而使代码看起来更直观。
它们还具有不污染类型的实际成员命名空间的优点,并允许您通过 using 关键字选择加入它们。
【讨论】:
扩展方法的存在很可能是因为微软需要在不改变接口的情况下为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 类,并保持与将方法添加到 IEnumerable 开始时相同的用户体验与。
【讨论】: