CSharp 扩展方法(extenstion method)
public class ProjectHelp { /// <summary> /// 向字符串追加字符 /// </summary www.it165.net > /// <param name="obj">字符串</param> /// <param name="AppendStr">需要追加的字符串</param> /// <returns>追加完成的字符对象</returns> public string AppendToLeft(string obj,string AppendStr) { return AppendStr + obj; } }
2.然后我们在程序的Main方法中调用该方法,将字符串添加至源字符串的左边,这里的需求是将电话号码的区号追加到电话号码前面。
static void Main(string[] args) { ProjectHelp help = new ProjectHelp(); string Tel = "87763445"; Console.WriteLine("Tel:"+help.AppendToLeft(Tel,"020-")); }
输出:020-87763445
我们所要做的就是这些,这也能满足我们的需求,从目前的需求上说不会出现任何的错误,然而,我们有没有发现以上代码有一些不整洁呢?AppendToLeft这个方法原本应该直接在String类中实现,我们的调用模式也应该由以上Main方法主体直接变为Tel.AppendToLeft
("020-"),但是事实总是如此的不尽人意,由于FCL中String类并没有添加和实现AppendToLeft这个方法,所以我们只能自己定义,所以才会出现上面这样的解决方案。
既然写这篇文章,那么就表示一定有一个更好的解决方案,您说是吗?否则需要说这么多干嘛呢?为了让开发人员的代码看上去更整洁一点,C#有一个好的解决方案,那就是文章标题提到的扩展方法,那么扩展方法怎么来使用呢?请看以下示例:
1.首先,我们需要在项目中添加自己的一个类型,此处为ProjectExt,其中的方法与之前定义的方法大致上无区别,只是在方法中第一个参数前面添加了this关键字,this关键字必须是在方法参数中第一个参数的前面,不可以移位。
public static class ProjectExt { /// <summary> /// 向字符串追加字符 /// </summary www.it165.net > /// <param name="obj">字符串</param> /// <param name="AppendStr">需要追加的字符串</param> /// <returns>追加完成的字符对象</returns> public static string AppendToLeft(this string obj,string AppendStr) { return AppendStr + obj; } }
2.像在调用FCL本身类库的方法一样调用AppendToLeft,我们的代码看起来更美丽整洁!
static void Main(string[] args) { string Tel = "87763445"; Console.WriteLine("Tel:"+ Tel.AppendToLeft("020-")); }
输出:020-87763445
我们可以浅而易懂的看到两者之间的区别,这就是扩展方法带来的便捷之处,让我们的代码更加的整洁,在使用扩展方法的时候必须注意一下几点:
1.第一个参数之前必须有this关键字,不可变动
2.在添加扩展方法的类型中,类型本身和类型所包含的方法必须是静态的。
3.由于这里是按类型识别,所以不应该将扩展方法的第一个参数类型设为object,这样会造成无论使用什么类型,都会扩展该方法。
4.必须考虑将来FCL可能会添加相同的方法,如果FCL在以后的版本中添加了该方法,那么C#会优先选择FCL所定义的方法。
最后的补充:
扩展方法为什么要添加一个this在前面呢?这引用类型的特性有关,this指向调用者本身,所以改变的也是调用者本身的实例,至于为什么在Visual Studio中能找到该方法,这是C#编辑器的功能,其中有一个搜索的过程,如果要使用不同命名空间下的扩展方法,请在代码顶端using该命名空间。另外,由于结构(struct)不能声明为静态,但是扩展方法必须声明在静态类型之中,所以不能在结构(struct)中声明扩展方法,这点必须要注意!