您的位置: 旅游网 > 爆料 >> 杂志

新特性扩展方法初探物业

发布时间:2021-10-26 07:19:55

C#3.0中一个激动人心的特性就是扩展方法:你可以使用实例方法的语法来调用静态方法。本文仔细阐述了这一新特性并且给出了几个相应的例子。

声明扩展方法

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

//

public static class EMClass

{

public static int ToInt32Ext(this string s)

{

return rse(s);

}

public static int ToInt32Static(string s)

{

return rse(s);

}

}

class Program

{

static void Main(string[] args)

{

string s = \"9\";

int i = Int32Ext(); // LINE A

iteLine(i);

int j = Int32Static(s); // LINE B

iteLine(j);

adLine();

}

}

为编译如上代码,你需要安装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,那么你可以运行命令行编译器:

e /reference:\"C:\\Program Files\\LINQ Preview\\Bin

\\l\"

/reference:C:\\WINDOWS\\\\Framework\\v2.0.50727\\l

/reference:\"C:\\Program Files\\LINQ Preview\\Bin\\l\"

/reference:\"C:\\Program Files\\LINQ Preview\\Bin\\l\"

/target:exe

就像你在如上代码里所看到的那样,扩展方法(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 [ery]ntime

.tensionAttribute::.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]32::Parse(string)

IL_0007: stloc.0

2000W开房数据随时会给信息被泄露者带来各种风险。 IL_0008: br.s IL_000a

IL_000a: ldloc.0

IL_000b: ret

} // end of method EMClass::ToInt32Ext

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

.method public hidebysig static int32 ToInt32Static(string s) cil managed

{

// Code size 12 (0xc)

.maxstack 1

.locals init ([0] int32 CSCODE_REPLACEMENT 300)

IL_0000: nop

IL_0001: ldarg.0

IL_0002: call int32 [mscorlib]32::Parse(string)

IL_0007: stloc.0

IL_0008: br.s IL_000a

IL_000a: ldloc.0

IL_000b: ret

} // end of method EMClass::ToInt32Static

.custom instance void: 本行代码说明本方法只能针对实例使用。

[ery]tensionAttribute::.ctor() = ( 01 00 00 00 ):本行代码说明扩展特性被使用了。

贵阳阴道炎治疗费用多少钱
改善睡眠质量吃什么好
南通哪家医院男科好
猜你会喜欢的
猜你会喜欢的