C#3.0新特性:扩展方法初探
C#3.0中一个令人兴奋的特性是扩展方法:你可以使用实例方法的语法来调用静态方法。本文详细阐述了这一新特性,并给出了几个相应的例子。
声明扩展方法
扩展方法的行为与静态方法非常相似。您只能在静态类中声明它们。若要声明扩展方法,需要为该方法的第一个参数指定此关键字,如以下示例所示:
//program . cs
public static class em class
{
public static int to int 32 ext(this string s)
{
return int 32。解析;
}
public static int to int 32 static(string s)
{
return int 32。解析;
}
}
类程序
{
static void Main(string[]args)
{
string s = " 9 ";
int I = s . toint 32 ext();// LINE A
控制台。WriteLine(I);
int j = EMClass。toint 32 static(s);//B线
控制台。写线(j);
控制台。ReadLine();
}
}
要编译上述代码,您需要安装Visual Studio 2005和LINQ的预览版。如果你已经安装了VS2005,那么你会在Visual C#的LINQ预览版中看到三个新的工程模板:LINQ命令行应用、LINQ窗口程序和LINQ库。按如下方式编译代码:
1.打开VS2005编辑器,创建一个新项目,并在“新建项目”窗口中选择“LINQ控制台”作为项目模板。
2.将项目命名为ExtensionMethods,然后单击Ok。
3.在编辑器中键入上面的代码。
4.按F5编译项目并运行它。
如果您刚刚安装了。net 2.0,那么您可以运行命令行编译器:
Csc.exe/reference:" C:\ Program Files \ LINQ预览\Bin
\System。data . dlinq . dll "
/reference:C:\ Windows \ Microsoft。NET \ Framework \ v 2 . 0 . 50727 \ System . dll
/reference:" C:\ Program Files \ LINQ预览\Bin\System。query . dll " "/br/]/reference:" C:\ Program Files \ LINQ预览\Bin\System。XML . xlinq . dll "
/target:exe program . cs
从上面的代码可以看出,扩展方法(ToInt32Ext)和普通静态方法(ToInt32Static)的区别在于:
1.扩展方法的第一个参数有这个关键字,而静态方法的参数声明中没有这个关键字。
2.使用扩展方法时,不会传递用该关键字声明的参数。在上面的例子中,A行是使用扩展方法ToInt32Ext的例子。您不需要向它传递参数。当使用静态方法时,不能忽略任何参数。的所有参数都必须传递到函数中。Line就是一个例子。
3.扩展方法只能在静态类中定义。对于静态方法,这不是一个要求,因为静态方法可以存在于静态类或普通类中。
4.只能为实例调用扩展方法。
扩展方法虽然本质上是静态的,但只能为实例调用。如果在类中调用它们,会导致编译错误。调用它们的类实例由声明中的第一个参数决定,该参数用关键字this修饰。
在IL内
如果您在IL中查看上述代码的分析结果,您将看到下图所示的结果:
以下是IL对扩展方法ToInt32Ext的分析:
。方法public hidebysig static int 32 toint 32 ext(string s)cil managed
{
。自定义实例void [System。查询]系统。runtime
. compiler services . extension attribute::。ctor() = ( 01 00 00 00 )
//代码大小12 (0xc)
。maxstack 1
。locals init([0]int 32 CSCODE _ REPLACEMENT 200)
IL _ 0000:nop
IL _ 0001:ldarg . 0
IL _ 0002:调用int32 [mscorlib]System。int 32::Parse(string)
IL _ 0007:stloc . 0
IL _ 0008:br . s IL _ 000 a
IL _ 000 a:LD loc . 0
IL _ 000 b:ret
}//em class::toint 32 ext方法结束
下面的代码是IL对静态方法ToInt32Static的分析:
。方法public hidebysig static int 32 toint 32 static(string s)cil managed
{
//代码大小12 (0xc)
。maxstack 1
。locals init([0]int 32 CSCODE _ REPLACEMENT 300)
IL _ 0000:nop
IL _ 0001:ldarg . 0
IL _ 0002:调用int32 [mscorlib]System。int 32::Parse(string)
IL _ 0007:stloc . 0
IL _ 0008:br . s IL _ 000 a
IL _ 000 a:LD loc . 0
IL _ 000 b:ret
}//em class::toint 32 static方法结束
。自定义实例void:这一行代码表明该方法只能用于实例。
[system.query] system.runtime .编译器服务. extensionattribute::。ctor () = (01 00 00 00):这一行代码表示已经使用了扩展特性。
位律师回复
0条评论