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

    新特性擴展方法初探物業

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

    貴陽陰道炎治療費用多少錢
    改善睡眠質量吃什么好
    南通哪家醫院男科好
    猜你會喜歡的
    猜你會喜歡的
    主站蜘蛛池模板: 久久久一本精品99久久精品66| 亚洲美女视频网站| 2020亚洲欧美日韩在线观看| 成人羞羞视频国产| 亚洲av产在线精品亚洲第一站| 97精品国产97久久久久久免费| 欧美日韩一区二区综合在线视频| 国产激情з∠视频一区二区| 一级做a爰片久久毛片| 日韩精品无码一区二区三区AV | 人人狠狠综合久久亚洲| 131美女爽爽爽爱做视频| 成人H动漫精品一区二区| 久热精品视频在线观看99小说| 波多野结衣上班| 午夜视频在线观看按摩女| 91香蕉视频直播| 国产色丁香久久综合| 一本一道dvd在线观看免费视频| 日韩av片无码一区二区三区不卡| 亚洲成a人片在线观| 男女无遮挡边做边吃视频免费 | 丰满妇女做a级毛片免费观看| 欧洲高清一区二区三区试看| 国产l精品国产亚洲区在线观看| 青青操免费在线视频| 大陆少妇xxxx做受| 久久综合丝袜日本网| 毛片大片免费看| 国产剧果冻传媒星空在线播放| 91久久香蕉国产线看| 日本一道高清一区二区三区| 亚洲国产美女在线观看| 色一乱一伦一图一区二区精品| 国产男女性潮高清免费网站| 99久久中文字幕伊人| 性无码一区二区三区在线观看| 久久精品国产欧美日韩亚洲| 欧美性狂丰满性猛交| 亚洲高清资源在线观看| 精品在线小视频|