新特性擴展方法初探物業
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 ):本行代碼說明擴展特性被使用了。
貴陽陰道炎治療費用多少錢改善睡眠質量吃什么好
南通哪家醫院男科好