C#中的扩展方法
2015-09-17 22:38
330 查看
扩展方法使用
在实际项目中,通常会定义一个静态类,类中包含一些常用的操作方法(如字符串处理,判断字符串是否是正确的电话号码或者Email等),将这些方法定义为静态方法,
使用方式:"静态类.静态方法(相关参数)",这样就不用实例化该类了,减少代码量,接下来说的扩展方法能使使用时代码更少。
c#3.0中引入扩展方法的概念,使用方式:在使用扩展方法的第一个参数前面加this关键字。下面演示了扩展方法的简单使用:
变量str1,str2都能成功转成大写。从表面上看变量str有一个TransferStrToUpper方法,但本质上其仍然是静态方法。
扩展方法本质
其实扩展方法本质并不是仅为了使代码的写法上发生改变,以上只是演示如何创建并使用扩展方法。
扩展方法的引入,能模拟为不同的类类创建实例方法。假设有这样一种场景,如果实际项目中有一个字符串处理类比如叫SayLove,
但是该类不允许修改它的源代码并且是个密封类(不允许被继承),但是会用到该类里的一些方法,比如方法SayLoveYou,
当然这时你可以再定一个类SayLoveExtend,在这个类里的一个方法ExpressLove将类SayLove实例作为参数,这样就可以使用类SayLove内部的一些方法,能解决问题。
但如果能在类SayLove的实例上调用新增的方法ExpressLove,而不是创建另一个作用于它的类SayLoveExtend的实例,这样看起来更加好看,仿佛这个新增的方法就是类SayLove内部的方法。
下面是对该段文字描述的程序描述:
程序输出:
在实际项目中,通常会定义一个静态类,类中包含一些常用的操作方法(如字符串处理,判断字符串是否是正确的电话号码或者Email等),将这些方法定义为静态方法,
使用方式:"静态类.静态方法(相关参数)",这样就不用实例化该类了,减少代码量,接下来说的扩展方法能使使用时代码更少。
c#3.0中引入扩展方法的概念,使用方式:在使用扩展方法的第一个参数前面加this关键字。下面演示了扩展方法的简单使用:
static class CommonHelper { public static string TransferStrToUpper(this string str) { return str.ToUpper(); } } class Program { static void Main(string[] args) { string str = "abcDEfg"; string str1=CommonHelper.TransferStrToUpper(str); string str2=str.TransferStrToUpper(); Console.WriteLine("str1={0},str2={1}",str1,str2); Console.ReadKey(); } }
变量str1,str2都能成功转成大写。从表面上看变量str有一个TransferStrToUpper方法,但本质上其仍然是静态方法。
扩展方法本质
其实扩展方法本质并不是仅为了使代码的写法上发生改变,以上只是演示如何创建并使用扩展方法。
扩展方法的引入,能模拟为不同的类类创建实例方法。假设有这样一种场景,如果实际项目中有一个字符串处理类比如叫SayLove,
但是该类不允许修改它的源代码并且是个密封类(不允许被继承),但是会用到该类里的一些方法,比如方法SayLoveYou,
当然这时你可以再定一个类SayLoveExtend,在这个类里的一个方法ExpressLove将类SayLove实例作为参数,这样就可以使用类SayLove内部的一些方法,能解决问题。
但如果能在类SayLove的实例上调用新增的方法ExpressLove,而不是创建另一个作用于它的类SayLoveExtend的实例,这样看起来更加好看,仿佛这个新增的方法就是类SayLove内部的方法。
下面是对该段文字描述的程序描述:
sealed class SayLove { public string SayLoveYou(string personName) { return personName + ",I Love you."; } } static class SayLoveExtend { public static string ExpressLove(this SayLove sl,string girlFirend) { return sl.SayLoveYou(girlFirend)+"Marry me."; } } class Program { static void Main(string[] args) { string str = "Lily"; SayLove sl = new SayLove(); string str1=sl.ExpressLove(str); Console.WriteLine(str1); Console.ReadKey(); } }
程序输出:
![](https://images2015.cnblogs.com/blog/345614/201509/345614-20150917224211648-1172633237.png)
相关文章推荐
- C#内存操作
- C#关于使用枚举遇到的问题----Parse()方法使用注意
- .NET基础--索引器
- C#中使用强制类型实现字符串和ASCII码之间的转换
- C#.net 多级cookie写入读取代码,一级、二级域名
- C#实现字符串数组的TreeMap排序
- C#关于使用枚举遇到的问题----Type运算符使用的必要性
- C# AttributeUsage
- C#笔记 值类型 引用类型
- C# winform 窗体间互操作(用委托与事件)
- C#实现子窗体与父窗体通信方法实例总结
- C#知识点总结:Monitor和Lock以及区别
- c#调用带输出参数的存储过程
- C# in Depth (第十章 扩展方法)
- c# 字符串切割 split
- c# 委托 事件
- C# 之 Excel 导入一列中既有汉字又有数字:数字可以正常导入,汉字导入为空
- C# winform 拖拽效果
- C# 策略模式
- C# Math.Round