代码之家  ›  专栏  ›  技术社区  ›  Krishna Kumar

C语言中扩展方法背后的设计动机是什么?#

  •  1
  • Krishna Kumar  · 技术社区  · 16 年前

    我想知道C语言中扩展方法背后的设计动机是什么#

    5 回复  |  直到 13 年前
        1
  •  11
  •   Inisheer    16 年前

    它允许您在不编辑原始代码的情况下为现有代码库创建新功能。

    http://weblogs.asp.net/scottgu/archive/2007/03/13/new-orcas-language-feature-extension-methods.aspx

    “扩展方法允许开发人员将新方法添加到现有clr类型的公共契约中,而无需对其进行子类化或重新编译原始类型。扩展方法有助于将当今动态语言中流行的“duck-typing”支持的灵活性与强类型语言的性能和编译时验证结合起来。 扩展方法支持各种有用的场景,并有助于实现真正强大的LINQ查询框架,该框架作为“orcas”版本的一部分与.NET一起引入。

        2
  •  3
  •   Mehrdad Afshari    16 年前

    它们存在的主要原因是能够在不继承类型的情况下,以某种方式向类型添加特性。

    这是需要提供的 Where , Select ,…在Linq中用于没有Linq的集合的方法。

        3
  •  2
  •   David Arno    16 年前

    它通过后门提供多重继承。

    它支持C++等语言,它支持从多个类继承,不需要扩展方法。然而,多重继承有很多问题,所以现代语言已经放弃了它。然而,扩展方法是一种用例,其中多个继承是有用的。不过,C设计人员没有重新引入多重继承,而是创建了扩展方法(这是解决问题的一个非常好的解决方案)。

        4
  •  1
  •   ocodo    13 年前

    我们经常会为自己编写一些有用的小实用工具静态类,这些类在类型上执行一个公共函数。我知道有很多次我希望可以简单地继承一个类来添加一个特性,但是这个类是密封的。我很高兴,虽然他们是密封的,毫无根据的继承是一件坏事。

    扩展方法允许这些静态方法看起来像是该类型的新实例方法,从而使代码看起来更直观。

    它们还具有不污染类型的实际成员命名空间的优点,并允许您通过 using 关键字。

        5
  •  0
  •   Steve Guidi    13 年前

    扩展方法的存在很可能是由于Microsoft需要将功能添加到 IEnumerable 无需更改接口。如果他们向接口添加方法,那么 可枚举的 (包括微软)将不再编译。

    改变的选择 可枚举的 是创建实用程序类(调用 Enumerable )它的方法对 可枚举的 . 除了用户体验与从现有的 可枚举的 实例。例如,比较以下等价语句。

    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编译器团队增加了对扩展方法的支持,允许创建 可枚举的 使用特殊语法初始化,并保持将方法添加到 可枚举的 首先。