.net 什么时候使用扩展方法,ext,方法与继承?

eaf3rand  于 2023-05-08  发布在  .NET
关注(0)|答案(8)|浏览(148)

我们开始使用C#(.NET 3.0),我想知道你们是如何使用扩展方法的?你什么时候使用它们?
此外,如果您也列出使用它们的所有黑暗先决条件,我将不胜感激。

jpfvwuh4

jpfvwuh41#

使用扩展方法的次数:

  • 当您不控制要扩展的类型时
  • 你不想强迫实现者提供可以用现有方法完成的代码

以第二点为例;你可能在IList<T>上有一个扩展方法(例如,Sort),它可以完全使用现有的IList<T>成员来编写...为什么要强迫别人写东西呢?这是LINQ的基础块,允许Microsoft在不破坏任何东西的情况下提供更多的功能。

使用扩展方法的次数:

  • 当多态性是关键时;您不能保证您的代码将是使用扩展方法执行的版本,因为直接针对该类型的方法优先
  • 当您需要访问私有/受保护成员时
llmtgqce

llmtgqce2#

扩展方法允许扩展现有的类,而不依赖于继承或必须更改类的源代码。这意味着,如果你想在现有的String类中添加一些方法,你可以很容易地做到。在决定是否使用扩展方法时,需要考虑以下几条规则:

  • 扩展方法不能用于重写现有方法
  • 将不会调用与示例方法同名和签名的扩展方法
  • 扩展方法的概念不能应用于字段、属性或事件
  • 有节制地使用扩展方法……过度使用可能是一件坏事!
ssm49v7z

ssm49v7z3#

这个链接http://geekswithblogs.net/BlackRabbitCoder/archive/2010/04/26/c-extension-methods---to-extend-or-not-to-extend.aspx提供了关于何时使用扩展方法以及何时不使用的很好的指导。
引用这篇文章:
一个好的扩展方法应该:

  • 应用于它扩展的类型的任何可能示例。
  • 简化逻辑并提高可读性/可维护性。
  • 应用于最特定的类型或适用的接口。
  • 在命名空间中隔离,以免污染IntelliSense。
yjghlzjz

yjghlzjz4#

当有意义时,我使用扩展方法。如果你控制一个类和它的代码,你通常不需要扩展方法。
如果你不这样做,一个扩展方法可能会有用。
我经常使用扩展方法的一个地方是[Flags]枚举。当你有一个基于标志的枚举时,需要一个相当大的表达式来确定一个枚举值是否有一个特定的标志集。因此,每当我构建[Flags]枚举时,我都会构建以下扩展方法:

[Flags]
public enum MyEnum
{
    FlagA,
    FlagB,
    // etc.
}

public static class MyEnumExt
{
    public static bool HasFlags(this MyEnum item, MyEnum query)
    {
        return ((item & query) == query);
    }
}

这样我的代码看起来像:

MyEnum flags = MyEnum.FlagA;
if(flags.HasFlags(MyEnum.FlagA))
{
  // handle FlagA
}

而不是:

MyEnum flags = MyEnum.FlagA;
if((flags & MyEnum.FlagA) == MyEnum.FlagA)
{
  // handle FlagA
}
ac1kyiln

ac1kyiln5#

老实说,我会说,当它不是一个好主意时,比当它是一个好主意时更容易解释。
我认为,扩展方法的主要好处是它们可以*增加你的方法的采用***。这是因为用户不必为了使用您的方法而示例化另一个类的示例,并且当开发人员正在为您正在扩展的类寻找方法时,intellisense将公布您的方法。如果您试图让其他开发人员在您的公司中遵循新标准,这可能很重要。
在考虑是否创建扩展方法时,请记住
SOLID**原则。

S单一职责:你几乎总是用扩展方法来弯曲单一责任原则,因为你正在添加已经是一个类的东西(你要么没有控制权,要么太害怕接触)。
Open/Close原则:- 扩展方法不能被覆盖,这意味着你的方法可能没有充分地“开放扩展”。
L伊斯科夫替换原理:- 如果你有任何类型的继承结构,你将无法在子类型上使用扩展方法。
I界面隔离原则:虽然你可以“扩展”一个接口,但你必须为这个扩展提供一个具体的实现。所以你不能对一个接口进行编程,而这个接口在不同的环境中可以不同的方式实现(例如单元测试)
D依赖倒置原理:- 如果你的代码有任何依赖项,你将如何为工厂和单元测试公开这些依赖项(依赖项反转原则)?

最后,扩展方法只是***穿着新衣服的静态方法。因此,静态方法的所有困难(如***线程安全,垃圾收集等***)都沿着着扩展方法,当你实现它们时。
所以,我会花很长时间认真考虑将方法作为扩展编写,并重新考虑使用工厂和基本助手类。
如果你真的要写一个扩展方法,请把它写得非常简单。尽量避免有任何依赖关系(或者将所有依赖关系作为参数传递)。在多线程环境中管理内存和锁定资源的方式要小心。

rjee0c15

rjee0c156#

什么是扩展方法?
扩展方法使您能够向现有类型添加方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。
扩展方法是一种特殊的静态方法,但它们被调用时就像它们是扩展类型上的示例方法一样。
如何使用扩展方法?
扩展方法是静态类的静态方法,其中“this”修饰符应用于第一个参数。第一个参数的类型将是被扩展的类型。
只有当您使用using指令将名称空间显式导入到源代码中时,扩展方法才在范围内。
使用扩展方法的要点:
1.扩展方法必须在顶级静态类中定义。
2.不会调用与示例方法同名和签名相同的扩展方法。
3.扩展方法不能用于重写现有方法。
4.扩展方法的概念不能应用于字段、属性或事件。
5.过度使用扩展方法不是一种好的编程风格。

r3i60tvu

r3i60tvu7#

当“Is-A”关系有意义时使用继承。继承会在类之间创建不必要的依赖关系。
当我觉得“如果XYZ类有ABC方法会有多好”时,我使用扩展方法。
我记得最好的例子是当我需要将集合分成块时使用扩展方法。这是细节。
https://www.codingcrest.com/extension-method-in-c/

jgzswidk

jgzswidk8#

在大多数情况下,扩展方法是一种不好的做法。它不是合约或接口的一部分,并且代码不需要包括要编译或构建的扩展方法代码。任何依赖的代码在没有它的情况下将停止工作。
在大多数情况下,这是一种不好的做法,因为它允许自由。您可以在Configuration类上使用Extension方法,并执行类似以下操作
Configuration.UploadFile();
这是糟糕的,因为上传文件不是配置的一部分,我看到开发人员这样做只是因为他们可以。
我会避免在99%的情况下使用扩展方法。如果你有其他选择,请使用它。

相关问题