Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中扩展方法背后的设计动机是什么_C#_.net 3.5_C# 3.0 - Fatal编程技术网

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

C# C语言中扩展方法背后的设计动机是什么,c#,.net-3.5,c#-3.0,C#,.net 3.5,C# 3.0,我想知道C中扩展方法背后的设计动机是什么?它们存在的主要原因是能够在不继承类型的情况下以某种方式向类型添加特性 这需要提供Where、Select、。。。在LINQ中用于没有集合的集合的方法。它们存在的主要原因是能够以某种方式向类型添加特性,而无需从类型继承 这需要提供Where、Select、。。。在LINQ中用于没有集合的集合的方法。它允许您在现有代码库中创建新功能,而无需编辑原始代码 扩展方法允许开发人员将新方法添加到现有CLR类型的公共约定中,而无需对其进行子类化或重新编译原始类型。扩展

我想知道C中扩展方法背后的设计动机是什么?它们存在的主要原因是能够在不继承类型的情况下以某种方式向类型添加特性


这需要提供Where、Select、。。。在LINQ中用于没有集合的集合的方法。

它们存在的主要原因是能够以某种方式向类型添加特性,而无需从类型继承


这需要提供Where、Select、。。。在LINQ中用于没有集合的集合的方法。

它允许您在现有代码库中创建新功能,而无需编辑原始代码

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

它允许您在现有代码库中创建新功能,而无需编辑原始代码

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

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

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


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

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

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


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

它通过后门提供多重继承


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

它通过后门提供多重继承


<> P>语言,如C++,支持从多个类继承,不需要扩展方法。然而多重继承有很多问题,所以现代语言已经放弃了它。然而,扩展方法是多重继承有用的用例。但是,C设计人员没有重新引入多重继承,而是创建了扩展方法,这是一个非常巧妙的问题解决方案。

扩展方法的存在很可能是因为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编译器团队增加了对扩展方法的支持,允许创建具有特殊语法的可枚举类,并保持相同的用户体验
首先将方法添加到IEnumerable。

扩展方法的存在很可能是因为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编译器团队增加了对扩展方法的支持,允许创建具有特殊语法的可枚举类,并保持与将方法添加到IEnumerable开始时相同的用户体验。

不仅仅是一个类,更重要的是一个接口。感谢Jon,为了更准确,我将其更改为类型。不仅仅是一个类,更重要的是一个接口。感谢Jon,我将其更改为类型以更准确。扩展方法更多…我可以向任何对象添加方法,但这些方法无法访问私有状态。我不需要源代码,所以我可以向框架类添加方法扩展方法更多…我可以向任何对象添加方法,但这些方法无法访问私有状态。我不需要源代码,所以我可以向框架类添加方法