您的位置: 旅游網 > 爆料 >> 雜志

    新特性擴展方法初探物業

    發布時間: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 ):本行代碼說明擴展特性被使用了。

    貴陽陰道炎治療費用多少錢
    改善睡眠質量吃什么好
    南通哪家醫院男科好
    猜你會喜歡的
    猜你會喜歡的
    主站蜘蛛池模板: 中文字幕在线视频观看| 亚洲欧美国产另类视频| 久久久xxxx| 天天做人人爱夜夜爽2020毛片| 亚洲AV无码成人网站在线观看 | 国产精品久久久久9999高清| 一区二区三区影院| 日本漫画免费大全飞翼全彩| 亚洲国产美女精品久久久久| 福利一区二区三区视频在线观看| 国产偷国产偷亚洲高清人| 1314成人网| 女皇跪趴受辱娇躯| 久久中文字幕无码专区| 校草让我脱了内裤给全班看| 亚洲色精品vr一区二区三区| 美腿丝袜亚洲综合| 国产成人久久综合二区| 67194在线看片| 天天拍拍天天爽免费视频| 久9久9精品免费观看| 最近中文字幕国语免费高清6| 亚洲精品一卡2卡3卡三卡四卡| 精品午夜福利1000在线观看| 国产亚洲精品美女久久久| jizzjizz中国护士第一次| 大学寝室沈樵无删减| 一级特黄录像在线观看| 日本三区四区免费高清不卡| 亚洲av日韩综合一区久热| 欧美疯狂性受xxxxx喷水| 免费人成网站7777视频| 羞羞视频网站免费入口| 国产又黄又爽胸又大免费视频| xxxxx在线| 国产高清一级片| mm1313亚洲国产精品无码试看| 成人黄色在线网站| 久久久久久AV无码免费网站下载 | 冈本视频老版app下载安装进入口 再一深点灬舒服灬太大了视频 | 日本特黄特色aaa大片免费|