.NET: 谈谈C#中的扩展方法

扩展方法(Extension Methods)是C#3.0时引入的新特性,相信不少人都听过而且也都用过,最多见的是在LINQ中的使用。

 不只如此,在开发中,咱们也能够建立本身扩展方法,使用它来优化类的设计、简化代码。本文将简单地介绍扩展方法的概念、定义、使用场景以及要注意的点。框架

1、概念

扩展方法是一种特殊类型的静态方法。对于一个C#类型,如类(包括密封类)、值类型、接口等,扩展方法能够在不改变该类型源码的前提下,为它的实例提供新的成员。所以,若要为一个框架或第三方库的某个类型增长辅助功能,经过扩展方法就能够垂手可得地实现,这也是“扩展”的意义所在。

2、如何定义

建立扩展方法很简单,有如下几个步骤:
一、建立一个静态类;
二、在其中建立一个静态方法;
三、为这个静态方法添加至少一个参数,并在第一个参数前加上this关键字,这个关键字会告诉编译器当前方法是一个扩展方法。而这个方法将成为第一个参数所属类型的新成员。
如下一个典型的扩展方法,用于为枚举值提供一个可获取其DescriptionAttribute特性值的方法:

 注意:只有在引用扩展方法所在的静态类的命名空间后,才能使用它;不然,直接调用会编译失败。上例中,使用该扩展方法要引用TLA.Infrastructure.Extensions命名空间。优化

3、什么时候使用

从扩展方法的概念上,不难看出,它能够用在如下几种场合:
一、要为某个类型扩展功能,但没有其源码,好比某个框架或第三方库中的一个类;例如,想要获取一个列表中全部的奇数项,就能够为IList<T>接口增长一个扩展方法,这里的IList<T>接口自己是.NET框架中的接口。

 二、即便能够访问原有类型的源码,也可使用扩展方法为它添加辅助功能;this

 三、重用代码,使代码更简洁;因为扩展方法封装了一段完整的逻辑,因此,使用扩展方法就避免了复制粘贴代码的状况。上例中扩展方法的内容也符合这种使用场景。spa

4、注意事项

如下是定义与使扩展方法时的一些注意事项和最佳实践: 一、扩展方法本质上是为原有类型提供辅助功能,所以,在建立时,要确保它具备实际意义,且遵循单一职责原则;也即,不能过分使用扩展方法而且它可以完成一个具体、完整的功能; 二、扩展方法自己具备通用性,所以,它里面应避免特定的业务数据类型及其相关逻辑; 三、若是为接口增长扩展方法,扩展方法的命名空间能够与接口的一致;不然,应尽可能避免与原类型写在同一命名空间下,这样会“污染”原类型。建议的作法是为扩展方法所在的类设定一个单独的命名空间,如:<Company>.<Product>.Extentions。不过,这样作也有缺点:在操做原有类型的实例时,若是不引用扩展方法所在的命名空间,那么,它就不容易被发现,而解决这个问题的办法是,尽可能将扩展方法文档化,并告诉项目组的其余开发人员; 四、为接口增长扩展方法后,则全部实现此接口的类都会包含该扩展方法; 五、在扩展方法中,要对第一个参数进行非空检查,若是为空,应抛出ArgumentNullException(参数为空)异常。
相关文章
相关标签/搜索