C# 3.0 新特性:扩展方法初探

来源:网络整理 责任编辑:栏目编辑 发表时间:2013-07-01 07:39 点击:
C#3.0中一个激动人心的特性就是扩展方法:你可以使用实例方法的语法来调用静态方法。本文仔细阐述了这一新特性并且给出了几个相应的例子。

  声明扩展方法

  扩展方法的行为和静态方法是非常类似的,你只能在静态类中声明它们。为声明一个扩展方法,你需要给该方法的第一个参数指定this关键字,如下例:

// Program.cs
public static class EMClass
{
 public static int ToInt32Ext(this string s)
 {
  return Int32.Parse(s);
 }
 public static int ToInt32Static(string s)
 {
  return Int32.Parse(s);
 }
}
class Program
{
 static void Main(string[] args)
 {
  string s = "9";
  int i = s.ToInt32Ext(); // LINE A
  Console.WriteLine(i);
  int j = EMClass.ToInt32Static(s); // LINE B
  Console.WriteLine(j);
  Console.ReadLine();
 }
}

  为编译如上代码,你需要安装Visual Studio 2005和LINQ的预览版。如果你已经安装了VS2005,那么你将在Visual C#的LINQ Preview里看到三个新的工程模板:LINQ命令行应用程序,LINQ窗口程序和LINQ库。如下操作编译代码:

  1. 打开VS2005编辑器,创建一个新工程,在新建工程窗口中选择LINQ Console作为工程模板。

  2. 将工程命名为ExtensionMethods,点击Ok。

  3. 将如上代码键入编辑器。

  4. 按下F5编译工程并运行。

  如果你只是安装了.NET 2.0,那么你可以运行命令行编译器:

Csc.exe /reference:"C:Program FilesLINQ PreviewBin
System.Data.DLINQ.dll"
/reference:C:WINDOWSMicrosoft.NETFrameworkv2.0.50727System.dll
/reference:"C:Program FilesLINQ PreviewBinSystem.Query.dll"
/reference:"C:Program FilesLINQ PreviewBinSystem.Xml.XLINQ.dll"
/target:exe Program.cs

  就像你在如上代码里所看到的那样,扩展方法(ToInt32Ext)和普通的静态方法(ToInt32Static)的不同在于:

  1. 扩展方法的第一个参数有一个this关键字,而静态方法不会在它的参数声明里有this关键字。

  2. 当使用扩展方法的是哦户,使用this关键字声明的的参数没有进行传递。在上面的例子里,Line A就是一个使用扩展方法ToInt32Ext的例子。不需要将参数传递给它。当静态方法在使用的时候,是不能忽略掉任何的参数的。所有的参数必须传递进入函数。Line B就是一个例子。

  3. 扩展方法只能在静态类中定义。对于静态方法,这并不成为一个要求,因为静态方法可以在一个静态类或普通类中存在。

  4. 扩展方法只能针对实例调用。

  扩展方法,尽管本质上还是静态的,但是只能针对实例调用。如果在一个类中调用它们将会引发编译错误。调用它们的类实例是由声明中的第一个参数决定的,就是有关键字this修饰的那个。

  在IL内部

  如果你观看IL里对以上代码的分析结果,你将会看到如下图的结果:


  以下是IL对于扩展方法ToInt32Ext的分析:

.method public hidebysig static int32 ToInt32Ext(string s) cil managed
{
 .custom instance void [System.Query]System.Runtime
 .CompilerServices.ExtensionAttribute::.ctor() = ( 01 00 00 00 )
 // Code size 12 (0xc)
 .maxstack 1
 .locals init ([0] int32 CSCODE_REPLACEMENT 200)
 IL_0000: nop
 IL_0001: ldarg.0
 IL_0002: call int32 [mscorlib]System.Int32::Parse(string)
 IL_0007: stloc.0
 IL_0008: br.s IL_000a
 IL_000a: ldloc.0
 IL_000b: ret
} // end of method EMClass::ToInt32Ext

  以下代码是IL对静态方法ToInt32Static的分析:

.method public hidebysig stat
    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    用户名: 验证码:点击我更换图片
    最新评论 更多>>

    推荐热点

    • 用C#制作屏幕捕获程序
    • .NET程序员项目开发必知必会—Dev环境中的集成测试用例执行时上
    • 遍历ArrayList易犯错误
    • C#对XML操作:一个处理XML文件的类(1)
    • .NET简谈反射(动态调用)
    • 使用C#编写LED样式时钟控件
    • DataList嵌套问题 如何删除内层子DataList的记录
    • 怎样用C#实现完整文档打印功能
    • .NET简谈自定义事务资源管理器
    网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
    Copyright © 2008-2015 计算机技术学习交流网. 版权所有

    豫ICP备11007008号-1