Sb5:关于C#扩展方法的理解

一直都没有写过扩展方法,但是近期在学习的过程中看到了这个(其实很早之前就看过,没有用到他就一直也没关注)。

那么、什么是扩展方法?扩展方法如何定义,扩展方法如何使用,扩展方法使用注意事项,我们下面从这几方面来说一下。

(说明,本文的知识并不是我独创,我也只是根据学习的东西搬运过来而已,之所以写这么具体,是希望下一个看我文章的朋友能够清晰的了解问题)

1、什么是扩展方法?

这个问题我想先从微软的光网抄一段,“扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。 扩展方法是一种静态方法,但可以像扩展类型上的实例方法一样进行调用。”,从微软官方开发文档来看,扩展方法首先是方法,而且是静态方法,同时他起到的作用应该可派生类中的方法同等作用,但是使用了扩展方法不需要对原类型进行派生。

2、扩展方法如何定义?如何使用扩展方法?

还是从微软官方开发文档来看,扩展方法应该定义在一个静态类中的静态方法。我又从微软官方文档中搬运了一段

  1. 定义包含扩展方法的静态。------------------------------------------------------------------定义一个静态类

    此类必须对客户端代码可见。 有关可访问性规则的详细信息,请参阅访问修饰符

  2. 将扩展方法实现为静态方法,并且使其可见性至少与所在类的可见性相同。--------定义一个静态方法

  3. 此方法的第一个参数指定方法所操作的类型;此参数前面必须加上 this 修饰符。---------这是关键,所定义的静态方法第一个参数必须是this开头,然后是索要扩展的类的对象

  4. 在调用代码中,添加 using 指令,用于指定包含扩展方法类的命名空间

  5. 和调用类型的实例方法那样调用这些方法。

    请注意,第一个参数并不是由调用代码指定,因为它表示要在其上应用运算符的类型,并且编译器已经知道对象的类型。 你只需通过 n 提供形参 2 的实参。

3、扩展方法使用过程中需要注意点什么?

刚接触这个扩展方法,可能觉得这个很牛,然后为了炫技,所以觉得所有的类都可以啥也不干了,将需要做的都放到类外面,使用扩展方法来定义,来实现他。可不可以?我想答案肯定是否定的。首先,我觉得这样去写代码肯定违背了代码的语义性,所编写的代码不符合面向对象的思想了,没有对事物进行封装处理(这只是我个人理解);其次当你对某一个类进行定义扩展方法,那么所有继承这个类的派生类都拥有了这个扩展方法,可能在此就无法保证这个扩展方法的可靠性了,另外如果基类已存在与扩展方法同名方法,那么程序会永远走不到扩展方法体中。其实扩展方法从微软命名就不难看出,他只是一种对原封装类进行的扩展方法,他不能取代类的定义。当我们在联合开发的过程中如果拿到其他同事的封装类,那么我们可以使用扩展方法对这个封装类进行完善。

4、备注

当我们使用扩展方法的时候,最好是在我们的解决方法中定义一个独立的命名空间来存储我们的扩展方法。这样的扩展方法我们就不容易错乱。

 

 

posted @ 2022-10-04 23:25  晨耕暮饮  阅读(57)  评论(0编辑  收藏  举报