扩展方法(深入理解c#)
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#)的更多相关文章
- c# 扩展方法初见理解
个人理解扩展方法是对某些类在不改变源码的基础上添加其他的方法.扩展方法必须是在非泛型的静态类里定义,且第一个参数是要使用this 指定需要扩展的类型. class Program { static v ...
- 关于.NET中迭代器的实现以及集合扩展方法的理解
在C#中所有的数据结构类型都实现IEnumerable或IEnumerable<T>接口(实现迭代器模式),可以实现对集合遍历(集合元素顺序访问).换句话可以这么说,只要实现上面这两个接口 ...
- c#扩展方法的理解(二:接口)
namespace ExtensionInterfaceMethod { class Program { static void Main(string[] args) { //使用接口变量来调用扩展 ...
- c#扩展方法的理解(一:初识)
扩展方法是静态方法,是类的一部分,但是实际上没有放在类的源代码中. 扩展方法所在的类也必须被声明为static C#只支持扩展方法,不支持扩展属性.扩展事件等. 扩展方法的第一个参数是要扩展的类型,放 ...
- C#扩展方法的理解
“扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.” 这是msdn上说的,也就是你可以对String,Int,DataRow,DataTable等这些 ...
- C#扩展方法的理解 (转)
“扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.” 这是msdn上说的,也就是你可以对String,Int,DataRow,DataTable等这些 ...
- C# 五、谈扩展方法的理解
http://www.cnblogs.com/zhaopei/p/5678842.html
- C#中的反射和扩展方法的运用
前段时间做了一个练手的小项目,采用的是三层架构,也就是Models,IDAL,DAL,BLL 和 Web , 在DAL层中各个类中有一个方法比较常用,那就是 RowToClass ,顾名思义,也就是将 ...
- C#扩展方法学习
扩展方法的本质是什么,详细见此文 C#扩展方法,爱你在心口难开 重点如下:扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.扩展方法是一种特殊的静态方法 ...
随机推荐
- centos 6.9 +nginx 配置GIT HTTPS服务器(证书采用自签名)
第一部分原通过SSH访问的GIT服务器迁移 1.把原服务器GIT资源库目录完成复制至新的服务器 2.安装GIT服务器 新的服务器 创建用户 useradd git password git 下载GIT ...
- 第二章 向量(d2)有序向量:二分查找
- 高级测试岗位面试题---MARK
直接手写一个python类 直接手写一个构造函数 紧接着上面的代码,直接手写,补充完整代码,要求对列表中的人进行排序,并筛选出分数大于80的人的名单,组成一个新的列表显示出来. class Perso ...
- 服务器使用VMware系软件管理主机集群
在服务器安装ESXI 6.0系统,此系统300多M,用于管理服务器上的主机. 其他主机安装个vsphere client连接后可ESXI系统可进行简单管理 如果要更强大的功能,需要安装vcenter ...
- swift 快速创建一些基本控件
1.tableview private lazy var cellId = "cellId" fileprivate lazy var tv : UITableView = { l ...
- java 编解码
decoder:解码--> 将文件内容转换为字符对象: encoder:编码-->将字符对象转换为字节或者字节数组: ASCII (American Standard for Infor ...
- ThinkPhp框架开发微信支付——刷卡支付
首先讲讲我遇到的坑: 1.下载了微信的demo,界面如下,一直调试不通过,原来点击链接地址是微信测试的网页地址...要改成自己开发的网页地址.... 2.demo不是用ThinkPhp框架的,我不懂, ...
- HR 常用事务代码
HR的键值权限查看: oosb 删除人员 : pu01 查看人员主数据:PA30 对人员进行入职.离职.调岗等基本操作:PA40 查看HR中的公式的意思:PE04 查看HR中的工资项:PE02 创建 ...
- rosrun和roslaunch
rosrun allows you to run an executable(可执行) in an arbitrary(任意) package without having to cd (or ros ...
- svn-经常遇到问题解答办法积累(一)
1.对于一个SVN使用新手,第一步,肯定是如何获取代码到本地指定的目录. 步骤: (1)新建一个存放svn中某一个代码库的目录,加入该目录命名为:Proj1SVN (2)右键鼠标,选择SVN Chec ...