2020-11-19

扩展方法的全面解析

一、扩展方法的介绍
对于扩展方法的理解可以拆分为–首先它肯定是一个方法,然而方法又是对于一个类型而言的,所以扩展方法可以理解为现有的类型(现有类型可以为自定义的类型和.Net类库中的类型)扩展(添加)应该附加到该类型中的方法。

在没有扩展方法之前,如果想为一个已有类型自定义自己逻辑的方法时,我们必须自定义一个新的类型来继承已有类型的方式来添加方法,使用这种继承方式来添加方法时,必须自定义一个新的派生类型,如果基类有抽象方法还需要重新去实现抽象方法,这样为了扩展一个方法却会导致因继承而带来的其他的开销,所以使用继承来为现有类型扩展方法时就有点大材小用的感觉了。并且当需要为值类型和密封类(不能被继承的类)这些不能被继承的类型扩展方法时,此时继承就不能被所用了,所以在C#3中提出了用扩展方法来实现为现有类型添加方法。使用扩展方法来实现扩展可以解决使用继承中所带来的所有的弊端。下面通过一个例子演示扩展方法的使用:
class Program
{
//扩展方法演示
static void Main(string[] args)
{
#region 演示扩展方法的使用

	//调用扩展方法
	WebRequest request = WebRequest.Create("http://www.cnblogs.com");
	using (WebResponse response = request.GetResponse())
	{
		using(Stream responsestrean = response.GetResponseStream())
		{
			using(FileStream output = File.Create("response.htm"))
			{
				//调用扩展方法
				responsestream.CopyToNewStream(output);
				Console.Read();
			}
		}
	}
	#endregion
}

}

//扩展方法必须在非泛型静态类中定义
public static class StreamExten
{
//定义扩展方法
//该扩展方法实现从一个流中内容复制到另一个流中
public static void CopyToNewStream(this Stream inputstream,Stream outputstream)
{
byte[] buffer = bew byte[8192];
int read;
while((read = inputstream.Read(buffer,0,buffer.Length)) > 0)
{
outputstream.Write(buffer,0,read);
}
}
}
上面程序中为Stream类型扩展了一个CopyToNewStream()的方法,然而从上面扩展方法的定义中可以知道扩展方法定义的一些规则,然而并不是所有方法都可以作为扩展方法来使用的,此时就会有疑问,如何去分辨代码中定义的是扩展方法还是普通的方法呢?对于这个疑问,扩展方法的定义是要符合一些规则的,当看到定义的方法是符合这个规则,则就可以确定定义方法是扩展方法还是普通方法了。扩展方法必须具备下面的规则:
*它必须在一个非嵌套、非泛型的静态类中
*它至少要有一个参数
*第一个参数必须加上this关键字作为前缀(第一个参数类型也称为扩展类型,即指方法对这个类型进行扩展)
*第一个参数不能用其他任何修饰符(如不能使用ref out等修饰符)
*第一个参数的类型不能是指针类型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值