.NET 3.5扩展方法点评:优点与问题

开发 后端
本文介绍了.NET 3.5扩展方法的一些特性,创建方法,优点以及存在的一些限制。扩展方法很好用,使用上确实可以和动态语言像 Python、Ruby 之类的相比了。

.NET 3.5扩展方法:新增的语言特性

原本,我听说 Partial Class 的时候,以为可以为已存在的类添加方法了,不过,Partial Class 只能在同一个 Assembly 之中的要求,使得它并不能实现这一点。.Net 3.5 增加了很多语言特性,扩展方法是其中一个。用扩展方法,我们就可以为已经存在的类添加方法。

  1. public static class ExtendTest      
  2. {      
  3.     public static Print(this object o)      
  4.     {      
  5.         Console.WriteLine(o);      
  6.     }      
  7. }     

之后,就可以对于任意的 object 使用这个方法:

  1. string s = "hello";      
  2. s.Print();      
  3. "X".Print();      
  4. MyClass x = new MyClass();      
  5. x.Print();     

.NET 3.5扩展方法的创建

对于扩展方法的创建,基本上,只有两点记住就可以了:必须是静态方法,***个参数增加 this 关键字。

用 Reflector 查看了一下,和我的猜测基本一致,其实它的实现是使用的自定义属性,所以扩展方法基本上可以看成是编译器特性:

  1. public static class ExtendTest      
  2. {      
  3.     [ Extend ]      
  4.     public static Print(object o)      
  5.     {      
  6.         Console.WriteLine(o);      
  7.     }      
  8. }     

扩展方法很好用,使用上确实可以和动态语言像 Python、Ruby 之类的相比了。不过,毕竟 C# 是静态语言,扩展方法还是有一些限制的。

.NET 3.5扩展方法的限制

一个限制是:不能使用原有类的私有或保护成员。这个问题,怎么说呢,大部分情况下没有问题,不过如果真的想使用私有或保护成员的时候,会很头疼。如果要给 .Net framework 中的类添加方法,这个问题也许并不是太大吧,毕竟一般我们也只知道它们的公有成员。如果要给自己的 DLL 添加一个新的 DLL,也做到原有 DLL 用于 .Net 2.0,新 DLL 扩展原 DLL 的话,比较会遇到。我在 DbEntry.Net 中对于这个问题的解决方案是,使用友元程序集。这种方法还是需要修改原 DLL,添加新 DLL 为友元程序集,另外,将需要访问的成员标注为 internal 才行。

另一个限制:不能给一个类添加静态方法。不知道是不是我没有找到,反正感觉,本来就是静态方法了,怎么才能再标注为实现静态方法呢?难道用 static static ?当然,使用的场景应该也不多吧。

再一个限制:不能给一个类添加接口。这个么,本来就不是扩展方法的设计目标,而且,实现上似乎也会麻烦很多,所以本来不该抱怨,不过,如果能实现的话,确实会有很多地方会很方便。比如,如果能给 DbObjectModel 添加 IQueryable 接口,就可以只通过增加一个 using 而实现所有的 Linq 功能,而有这个限制的时候,只能再实现一个 LinqDbObjectModel 之类的了……

我发现的,就这3个限制,其它方面,都实现的很好,IDE 提示也很舒服~

【编辑推荐】

  1. 浅析C#扩展方法
  2. .NET 3.5扩展方法和Lambda表达式
  3. Lambda表达式:要性能还是要清晰的代码?
  4. .NET Lambda表达式的函数式特性:索引示例
  5. .NET Lambda表达式的语义:字符串列表范例
责任编辑:yangsai 来源: JavaEye博客
相关推荐

2009-08-10 17:11:34

.NET 3.5扩展方Lambda表达式

2010-01-21 10:48:18

VB.NET扩展方法

2009-12-02 09:07:45

ASP.NET 4.0

2009-07-24 15:47:35

ASP.NET与ASP

2010-01-05 15:52:07

.NET Framew

2010-03-12 18:16:07

Python编程语言

2009-07-29 15:17:42

验证控件ASP.NET1.1ASP.NET2.0

2009-12-14 16:59:57

.NET Framew

2009-08-05 15:50:13

ASP.NET优点

2009-06-18 15:14:53

Spring osgi

2009-08-06 16:11:17

2009-03-09 10:28:45

AJAXASP.NETWEB

2009-07-27 17:38:30

WCF服务ASP.NET 3.5

2009-12-10 14:04:09

.Net Framew

2009-12-22 09:25:57

ADO.NET3.5

2009-12-14 10:19:23

.NET Framew

2009-02-01 13:57:53

ASP.NET.NET图表控件

2009-08-12 17:33:25

继承与扩展方法

2010-01-06 11:21:49

.NET Framew

2009-08-17 10:16:26

ASP.NET的WEB
点赞
收藏

51CTO技术栈公众号