C#之Extension Method
来源:互联网 发布:linux从其他机器复制 编辑:程序博客网 时间:2024/05/06 02:23
看起来代码更便捷了
按MSDN的定义——扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。这里的“添加”之所以使用引号,是因为并没有真正地向指定类型添加方法。
比如,string类型有一个IsNullOrEmpty方法,用于测试某字符串是否为null或空。类似地,有时我们还需要一个方法,来测试某字符串是否为null、空字符串或者包含的字符都是空白字符。传统的一种方法是在像StringHelper这样的类中添加一个IsBlank方法:
public static class StringHelper{ public static bool IsBlank(string s) { if (string.IsNullOrEmpty(s)) { return true; } return (s.Trim().Length == 0); }}
在使用时,需要这样:
string s = null;Assert.IsTrue(StringHelper.IsBlank(s));
这样看来,在完成所需功能时,string类型的实例需要另一个类StringHelper的帮助,显得不甚简洁。使用扩展方法,则变成这样:
public static class StringExtension{ public static bool IsBlank(this string s) { if (string.IsNullOrEmpty(s)) { return true; } return (s.Trim().Length == 0); }}// 使用string s = null;Assert.IsTrue(s.IsBlank());
所以,扩展方法实际上提供了一种机制,使得代码在访问诸如StringHelper.IsBlank这样的静态方法时更为便捷。它用起来就像是被扩展类型确实具有该实例方法一样。
仅仅如此吗?
不过,这种便捷性只是最浅显的好处,我们接着往下看。微软不会仅仅为了这种便捷性就在C#中添加这样一个特性,在LINQ 的演变及其对 C# 设计的影响一文中可以看到,其根源在于向IEnumerator<T>接口添加方法时,如果直接向该接口添加方法,那么不仅仅它的未来实现要实现该方法,现有的实现亦是如此!这就很不现实了。通过扩展方法,只要借助于已有的静态类语法结构就可以实现了,代价要小得多。
上面这个场景体现了在扩展一个类型时扩展方法的价值。还有其它类似的场景:我们希望向一个类添加成员。我们可以直接修改该类,但需要重新编译和部署,有时候可能代价较高;或许可以考虑继承和包装该类,但是存在于上面方法类似的问题;我们甚至不能修改或继承该类,比如string类或第三方组件中的某些类。这时使用扩展方法就可以比较柔和地注入所需的功能了。
这样我们就在代码可扩展性方面有了很强的能力了,于是可以做更多的事情。在此,就不再赘述了,可以参考鹤冲天同学的文章以及斯克迪亚同学的文章。
除了上述便捷性与扩展性方面的好处,还有很有价值的额外所得。
对代码可读性的提升
还是看前面IsBlank的例子,在使用时两种方法会有很大的不同:
if (StringHelper.IsBlank(s)){ // DoSomething...}if (s.IsBlank()){ // DoSomething...}
显然,后者的可读性有了很大的提高。另一方面从职责上来说,IsBlank更像是string的一个属性,将其“添加”到string类型更为合适。
小结
综上所述,扩展方法首先让我们获得了很强的扩展性方面的能力,可以将很多代码抽象为扩展方法,同时它也会让代码变得更为简洁、直接,这样就带来了一个额外的好处:可读性的提升。
参考
扩展方法(C# 编程指南)
LINQ 的演变及其对 C# 设计的影响
c#扩展方法奇思妙用
自用扩展方法分享
- C#之Extension Method
- C# 之 Extension Method
- C# Extension Method
- c# extension method
- C# 扩展方法Extension Method
- C# constructor chain and extension method
- 扩展Unity3d 组件方法,简化API使用 - C#特性之 Extension Method
- Extension Method
- Extension Method 和lambda
- Extension Method In .Net
- CSharp - Extension method usage
- C#基础之方法(Method)
- C#2008新特性--(扩展方法)Extension Method
- [原创]深入理解C# 3.x的新特性(2):Extension Method - Part II
- [原创]深入理解C# 3.x的新特性(2):Extension Method - Part I
- 理解C# 3.0新特性之Extension方法浅议
- 理解C# 3.0新特性之Extension方法浅议
- C#设计模式之Template Method
- 得到最新编号的函数
- Linux中常用的快捷键设置
- smarty相关理解
- 随机数组,从右往左寻找第一个大于当前数字的值得下标
- linux下的分辨率设置
- C#之Extension Method
- NET 2.0 调用FFMPEG,并异步读取输出信息的代码
- 链栈基本运算的实现
- hdoj 2629 Identity Card【操蛋题】
- iphone消息推送原理
- j2me内存监控
- iPhone中滚动显示UITextView
- 算法实现数组前半部分为奇数,后半部分为偶数。
- 链队列基本运算的实现