Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.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/6/entity-framework/4.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#_Extension Methods_Class Library - Fatal编程技术网

为什么要在C#类库中使用扩展方法

为什么要在C#类库中使用扩展方法,c#,extension-methods,class-library,C#,Extension Methods,Class Library,我确实经历了一些。我发现扩展方法也有文档记录 我不明白,为什么这些基类库有扩展方法?什么时候可以将它们添加到特定的类库中 优势是什么?差异?顾名思义,扩展方法扩展了目标类型的功能或可用性 这些方法可以在类型已发布之后添加(比类型编写时间晚) 它们可以由不同的人群编写 扩展方法可以以接口为目标。(另一种选择是使用具有这些方法的公共基类型或在每种类型中重新实现它们) 不同的人可以根据自己的需要对同一类型进行不同的扩展 正确使用扩展方法可以消除实际类型定义/实现中的正交杂波(而不是在类型定义中关注类型

我确实经历了一些。我发现扩展方法也有文档记录

我不明白,为什么这些基类库有扩展方法?什么时候可以将它们添加到特定的类库中


优势是什么?差异?

顾名思义,扩展方法扩展了目标类型的功能或可用性

  • 这些方法可以在类型已发布之后添加(比类型编写时间晚)
  • 它们可以由不同的人群编写
  • 扩展方法可以以接口为目标。(另一种选择是使用具有这些方法的公共基类型或在每种类型中重新实现它们)
  • 不同的人可以根据自己的需要对同一类型进行不同的扩展
  • 正确使用扩展方法可以消除实际类型定义/实现中的正交杂波(而不是在类型定义中关注类型的核心功能)


    以LINQ为例—通过向
    IEnumerable
    提供扩展方法,它可以针对大量已经发布的类型(以及将来可能编写的大量类型);它将正交关注点(如查询类型)从实际类型中分离出来

    所记录的扩展方法在
    IEnumerable
    上定义,它实现了
    ObjectSet

    它们有文档记录,因此您知道您可以使用它们


    作为扩展方法,它们最终免费扩展实现此接口的任何类型。

    注意,这些方法中的许多都在接口上运行,这是使用扩展方法的一个完全合法的借口,即使是微软,因为接口本身也无法实现任何方法。

    我认为这很可能是一个“营销问题”。建议
    BCL
    消费者(我们)在我们需要的地方使用扩展方法的方法


    从可用性的角度来看,imo,将它们集成到清单上的第3项中没有任何好处,这是完全错误的。它完全曲解了“备选方案”中描述的扩展方法的机制。另外,“从实际类型查询类型”是什么意思?@A.R.,也许你需要解释一下#3中的错误。#3的一个很好的例子是
    IEnumerable
    ——如果接口不能被扩展方法作为目标,那么一些主体将不得不为特定类型(或它们的公共基类型)中的所有这些方法编写实现。@A.R.,此外,我使用了术语“正交关注点,例如从实际类型查询类型”在
    IEnumerable
    的上下文中,它仅仅意味着不同的集合,如字典、列表、队列、集合、堆栈等,不必为各种查询方法(联接、计数、第一、最后等)提供实现。这种逻辑并不是这些类的核心问题,实际的替代方法是编写一个静态方法,将“IEnumeralbe”实例作为参数。这正是扩展方法在编译时所做的。建议某些“基类”必须“重新实现”相当于帮助函数的功能,这既荒谬又危险地误导。以扩展方法“Max”为例,在建议的“备选方案”中使用它。我到底需要在什么时候重新实现它?您关于LINQ的最后一点,以及对它的解释毫无意义。您建议扩展方法在这些集合类型上“提供实现”,而扩展方法并不是这样做的。