随笔 - 57  文章 - 0 评论 - 353 trackbacks - 13
<2008年1月>
303112345
6789101112
13141516171819
20212223242526
272829303112
3456789

与我联系

搜索

 

留言簿(4)

我管理的小组

随笔分类(48)

随笔档案(51)

积分与排名

  • 积分 - 74664
  • 排名 - 539

最新评论

阅读排行榜

评论排行榜

在c#3.0中可以出现这样的语法 
int i = 2;
Console.WriteLine(i.Square());
这就是扩展方法。

如何使int具有Square方法呢?
只需要定义这样一个函数
        public static int Square(this int i)
       {
            return i * i;
        }
        this 表示针对int的实例和索引器的this的含义是一样的,int表示给int这种类型进行扩展

但是这个扩展函数是有一定限制的。
 1 扩展方法必须是静态的 
 2 扩展方法必须在顶级静态类上定义
来看看IL实现
.method public hidebysig static int32  Square(int32 i) cil managed
{
  .custom instance void [System.Core]System.Runtime.CompilerServices.ExtensionAttribute::.ctor() = ( 01 00 00 00 )
  // 代码大小       9 (0x9)
  .maxstack  2
  .locals init ([0] int32 CS$1$0000)
  IL_0000:  nop
  IL_0001:  ldarg.0
  IL_0002:  ldarg.0
  IL_0003:  mul
  IL_0004:  stloc.0
  IL_0005:  br.s       IL_0007
  IL_0007:  ldloc.0
  IL_0008:  ret
} // end of method MyExtention::Square

C#编译器生成了MyExtention.Square(int32 i),并没有对int类型进行改变。我们可以把他当作visitor模式来使用,但是跟visitor是有本质不同的。
posted on 2008-01-06 19:40 tianyamoon 阅读(703) 评论(3)  编辑 收藏 所属分类: c#技术Visual Studio 2008

FeedBack:
#1楼  2008-01-06 19:49 冬冬      
扩展方法就是换一种方式调用静态方法。
BTW:记得检查扩展对象是否是Null。AObject.ExtMethod()这样的调用方式很容易让你忘了AObject可能为空~~~
  回复  引用  查看    
#2楼  2008-01-07 22:53 BirdsHover      
最喜欢这个了,每次编码都为int转换要那么多编码发愁,在2.0就想实现object类扩展出ToInt()方法,一直没成功。查看3.5的代码发现是System.Core.dll实现了,无奈中....
  回复  引用  查看    
#3楼  2008-07-22 09:53 boyi [未注册用户]
类级别的装饰模式!
  回复  引用    

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-01-06 20:01 编辑过


相关链接: