【C#】扩展方法浅谈
C#3 引入的扩展方法这一个理念.
扩展方法最明显的特征是在方法参数中第一个参数有this声明. 其实C#库中有很多已经是扩展方法了.比如linq中对序列使用的查询语句, where, select等都是经过扩展的方法.

由于有很多抽象的方法, 比如stream这种, 在很多继承类里面没有完全的达到使用者的目的, 使用者往往需要自己写一个工具类, 例如StreamUtil来维护所有的继承类, 一般这种工具类都是静态的. C#3可以使用扩展方法来改进这一需求的实现.
例如代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO; namespace DennisDemos.Demos
{
public static class StreamUtil
{
const int BufferSize = ;
public static void Copy(Stream input, Stream output)
{
byte[] buffer = new byte[BufferSize];
int read;
while ((read = input.Read(buffer,,buffer.Length)) > )
{
output.Write(buffer, , read);
}
}
public static byte[] ReadFully(Stream input)
{
using (MemoryStream ms = new MemoryStream())
{
Copy(input, ms);
return ms.ToArray();
}
}
}
}
StreamUtil
 WebRequest request = WebRequest.Create("http://www.baidu.com");
             using (WebResponse response = request.GetResponse())
             using (Stream responseStream = response.GetResponseStream())
             using (FileStream output = File.Create("response.dat"))
             {
                 StreamUtil.Copy(responseStream, output);
             }
了解扩展方法的使用时机以及方式
并不是所有方法都可以作为扩展方法使用, 他必须具备以下特征:
1. 必须在一个非嵌套的, 非泛型的静态类中(所以必须是一个静态方法)
2. 至少要有一个参数
3. 第一个参数必须附加this
4. 第一个参数不能有其他任何修饰符, 比如ref
5. 第一个参数的类型不能使指针类型.
这里第一个参数的类型成为方法的扩展类型.
【C#】扩展方法浅谈的更多相关文章
- JavaScript中toStirng()与Object.prototype.toString.call()方法浅谈
		
toStirng()与Object.prototype.toString.call()方法浅谈 一.toString()是一个怎样的方法?它是能将某一个值转化为字符串的方法.然而它是如何将一个值从一种 ...
 - toStirng()与Object.prototype.toString.call()方法浅谈
		
一.toString()是一个怎样的方法?它是能将某一个值转化为字符串的方法.然而它是如何将一个值从一种类型转化为字符串类型的呢? 通过下面几个例子,我们便能获得答案: 1.将boolean类型的值转 ...
 - Android事件侦听器回调方法浅谈
		
http://developer.51cto.com/art/201001/180846.htm Android事件侦听器作为视图View类的接口,其中包含有不少回调方法,比如:onClick():o ...
 - C#使用IHttpModule接口修改http输出的方法浅谈
		
一.但你每次请求浏览一个页面,比如Login.aspx的时候,都会执行配置文件中system.webserver内的model这个节点的东西(这个是属于遍历的逻辑执行,会将model这个节点的东西全部 ...
 - Object.prototype.toString.call()方法浅谈
		
使用Object.prototype上的原生toString()方法判断数据类型,使用方法如下: Object.prototype.toString.call(value) 1.判断基本类型: Obj ...
 - Android中SQLiteOpenHelper类的onUpgrade方法浅谈
		
public abstract void onUpgrade(SQLiteDatabase db,int oldVersion,int new Version) 这个方法在实现时需要重写. onUpg ...
 - 注册mySQL到JDBC驱动程序方法浅谈
		
一.注册方法(4种) 1)服务提供者框架: 符合JDBC 4.0规范的驱动程序包含了一个文件META-INF/services/java.sql.Driver,在这个文件中提供了JDBC驱动实现的类名 ...
 - PHP 魔术方法浅谈
		
php中把以两个下划线(__)开头的方法称之为魔术方法.魔术方法包括: __construct() 类的构造方法 构建方法时被调用 __destruct() 类的析构方法 明确销毁 ...
 - SVN冲突出现原因及解决方法浅谈
		
缘由 很简单,用svn合base,出现了各种各样奇怪的问题,虽然最终没有造成什么大的线上问题,但过程也是曲折的,耗费个人精力,也占用他人资源,不好不好,一点都不佛系. 究其原因,还是对为什么出现各种冲 ...
 
随机推荐
- https://scrapingclub.com/exercise/detail_cookie/
			
def parse(self, response): pattern=re.compile('token=(.*?);') token=pattern.findall( response.header ...
 - 关于SQL语句中的distinct和group by
			
两种都能实现去重功能.区别: distinct只是将重复的行从结果中出去: group by是按指定的列分组,一般这时在select中会用到聚合函数. distinct是把不同的记录显示出来 grou ...
 - 20165316 技能学习心得与c语言学习
			
20165316 技能学习心得与c语言学习 一.技能学习经验 我会打乒乓球,在中国,我只能说我"会"打,至于"比大多数人更好"我不敢断言,因为我无时无刻不感受到 ...
 - POJ 2492 A Bug's Life (并查集)
			
Background Professor Hopper is researching the sexual behavior of a rare species of bugs. He assumes ...
 - SQL Server中调用WebService
			
首先要启用Ole Automation Procedures,使用sp_configure 配置时如果报错"不支持对系统目录进行即席更新",可以加上WITH OVERRIDE选项. ...
 - Prometheus监控学习笔记之PromQL简单示例
			
0x00 简单的时间序列选择 返回度量指标 http_requests_total 的所有时间序列样本数据: http_requests_total 返回度量指标名称为 http_requests_t ...
 - bzoj2152 / P2634 [国家集训队]聪聪可可(点分治)
			
P2634 [国家集训队]聪聪可可 淀粉质点分治板子 边权直接 mod 3 直接点分治统计出所有的符合条件的点对再和总方案数约分 至于约分.....gcd搞搞就好辣 #include<iostr ...
 - Linux 使用 github  常用命令
			
Linux 使用 github 常用命令 今天整理一下常用的 github 命令,自己只是一个编程小白,有些地方可能做的不是很好,仅仅用作自己的学习使用. 创建一个文件夹用于存放github仓库 m ...
 - U盘中病毒,文件消失或不显示
			
最近非常流行的一个病毒,将电脑或者U盘里的文件全部用快捷方式替换,真实文件被隐藏起来,下面我们就具体了解下此种病毒吧,做好预防与杀毒工作. 一.病毒名称 病毒名称:移动盘同名文件夹病毒;文件夹EXE病 ...
 - Vmware 安装centos7与网络配置
			
一.下载linux镜像 下载地址:http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1804.iso 二.创 ...