1. 静态类到扩展方法:

许多方法可能都适合转为扩展方法,只要具有以下特征:

1)你想为一个类型添加一些成员;

2)你不需要为类型的实例添加更多的数据;

3)你不能改变类型本身,因为是别人的代码

2.声明扩展方法

并不是任何方法都能作为扩展方法使用——他必须具有以下特征:

1)他必须在一个非嵌套的,非泛型的静态类中(所以必须是一个静态方法);

2)他至少要有一个参数;

3)第一个参数必须附加this关键字作为前缀;

4)第一个参数不能有其他任何修饰符(比如out或ref);

5)第一个参数不能是指针类型;

我们将第一个参数的类型称为方法的扩展类型,即指该方法扩展了该类型,代码:

public static class StreamUtil

{

const int BufferSize = 8192;

public static void CopyTo(this Stream input,Stream output)

{

byte[] buffer = new byte[BufferSize];

int read;

while((read = input.Read(buffer,0,buffer.Length)) > 0)

{

output.Write(buffer,0,read);

}

}

}

调用:

Stream responseStream = new Stream();

responseStream.CopyTo();

3. 扩展方法是怎样被发现的

知道怎样调用扩展方法固然重要,但知道怎样不调用同样重要。换言之,你要知道如何实现“非请勿来”。

首先了解编译器怎样决定要使用的扩展方法

如果使用using指令,扩展方法可以像类一样不加限制的在代码中使用。如果编译器认为一个表达式好像是要使用一个实例方法,但没有找到与这个方法调用兼容的实例方法(名称不兼容或参数不兼容)。就会查找一个合适的扩展方法。塔会检查导入的所有命名空间和当前命名空间的所有扩展方法,并匹配那些从表达式类型到扩展类型存在着隐式转换的扩展方法。(编译器怎么找到库中的扩展方法:它会检查类和方法是否具有System.Runtime.CompilerServices.ExtensionAttribute这个特性,它是.NET3.5新增的。但是,编译器不检查特性来自哪个程序集,这意味着即使你的项目面向的是.NET2.0,仍然可以使用扩展方法——只需在正确的命名空间中使用正确的名称来定义自己的属性就可以了(即自己编写一个System.Runtime.CompilerServices.ExtensionAttribute类))

如果存在多个适用的扩展方法,他们可应用于不同的扩展类型(使用隐式转换),那么将使用在重载的方法中应用的 “更好的转换” 规则,来选择最合适的方法。

要注意的一个重点是,如果存在适当的实例方法,则实例方法肯定会先于扩展方法使用。

在c#中,你不能在空引用上调用实例方法,但你可以在空引用上调用扩展方法。

4. 使用思路和原则

如果你觉得代码最重要的就是他的结果,扩展方法肯定相当和你胃口,如果觉得实现更重要,那么显式调用静态方法就显得更清晰,实际上,这是“是什么”和“怎么做“之间的差异

扩展方法(深入理解c#)的更多相关文章

  1. c# 扩展方法初见理解

    个人理解扩展方法是对某些类在不改变源码的基础上添加其他的方法.扩展方法必须是在非泛型的静态类里定义,且第一个参数是要使用this 指定需要扩展的类型. class Program { static v ...

  2. 关于.NET中迭代器的实现以及集合扩展方法的理解

    在C#中所有的数据结构类型都实现IEnumerable或IEnumerable<T>接口(实现迭代器模式),可以实现对集合遍历(集合元素顺序访问).换句话可以这么说,只要实现上面这两个接口 ...

  3. c#扩展方法的理解(二:接口)

    namespace ExtensionInterfaceMethod { class Program { static void Main(string[] args) { //使用接口变量来调用扩展 ...

  4. c#扩展方法的理解(一:初识)

    扩展方法是静态方法,是类的一部分,但是实际上没有放在类的源代码中. 扩展方法所在的类也必须被声明为static C#只支持扩展方法,不支持扩展属性.扩展事件等. 扩展方法的第一个参数是要扩展的类型,放 ...

  5. C#扩展方法的理解

    “扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.” 这是msdn上说的,也就是你可以对String,Int,DataRow,DataTable等这些 ...

  6. C#扩展方法的理解 (转)

    “扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.” 这是msdn上说的,也就是你可以对String,Int,DataRow,DataTable等这些 ...

  7. C# 五、谈扩展方法的理解

    http://www.cnblogs.com/zhaopei/p/5678842.html

  8. C#中的反射和扩展方法的运用

    前段时间做了一个练手的小项目,采用的是三层架构,也就是Models,IDAL,DAL,BLL 和 Web , 在DAL层中各个类中有一个方法比较常用,那就是 RowToClass ,顾名思义,也就是将 ...

  9. C#扩展方法学习

    扩展方法的本质是什么,详细见此文 C#扩展方法,爱你在心口难开 重点如下:扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.扩展方法是一种特殊的静态方法 ...

随机推荐

  1. CentOS 下搭建SVN

    CentOS 7下搭建配置SVN服务器 1. 安装 CentOS通过yum安装subversion. $ sudo yum install subversion subversion安装在/bin目录 ...

  2. 思维+并查集 hdu5652

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5652 题意: 输入T,接下来T个样例,每个样例输入n,m代表图的大小,接下来n行,每行m个数,代表图, ...

  3. OSPF网络类型不一致路由无法计算的问题

    晚上割接,远端的ASR9001-s网络类型为广播类型,本端为6509-e,网络接口类型修改成p2p后,OSPF邻居关系建立,但是路由无法计算.

  4. Mybatis 表名是变量时

    写语句时这样就可以了 <select id="selectTotal" resultType="java.util.Map" parameterType= ...

  5. 【mysql】主从同步,事务等概念

    问题: mysql用binary log来保证主从同步的可靠性和安全性,在mysql中,主从同步是异步线程和异步任务来保证的. (在这点上,其它存储引擎有另外的选项,比如mongoDB和Elastic ...

  6. PTA 7-6 列出连通集(深搜+广搜)

    给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集.假设顶点从0到N−1编号.进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点. 输入格式: 输入第1 ...

  7. iOS开发时使用的bundle路径

    bundle是一个目录,其中包含了程序会使用到的资源. 这些资源包含了如图像,声音,编译好的代码,nib文件(用户也会把bundle称为plug-in). 对应bundle,cocoa提供了类NSBu ...

  8. python中类变量和成员变量、局部变量总结

    class Member(): num= #类变量,可以直接用类调用,或用实例对象调用 def __init__(self,x,y): self.x=x #实例变量(成员变量),需要它是在类的构造函数 ...

  9. 如何获取google Api Key

    1.使用keytool申请获取MD5值 1.1 找到你的debug.keystore Windows Vista/7: C:\Users\<username>\.android\debug ...

  10. 织梦替换ueditor百度编辑器,支持图片水印 教程

    1下载ueditor百度编辑器 2 把下载的zip解压得到ueditor文件夹,把解压到的ueditor文件夹扔进你网站的include文件夹去 3 打开 /include/inc/inc_fun_f ...