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

C#3.0新特性:扩展方法初探,第1张

C#3.0新特性:扩展方法初探,第2张

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):这一行代码表示已经使用了扩展特性。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C#3.0新特性:扩展方法初探

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情