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

    新特性擴展方法初探物業

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

    貴陽陰道炎治療費用多少錢
    改善睡眠質量吃什么好
    南通哪家醫院男科好
    猜你會喜歡的
    猜你會喜歡的
    主站蜘蛛池模板: 亚洲精品伊人久久久久| 国产午夜无码精品免费看| 中文在线观看永久免费| 欧美交换乱理伦片在线观看| 公求求你不要she在里面小说| 黑人一级大毛片| 图片区亚洲色图| 中文字幕久久久| 日韩视频一区二区| 亚洲精品无码mv在线观看网站| 老子影院午夜伦手机不卡无| 国产欧美日韩另类精彩视频| 99在线精品视频在线观看| 成年男女免费视频网站| 久草视频免费在线| 欧美精品久久一区二区三区| 再深点灬舒服灬太大了网立占| 香蕉大战欧美在线看黑人| 国产自产21区| аⅴ中文在线天堂| 无码人妻丰满熟妇区毛片| 亚洲av无码专区国产乱码不卡| 激情综合亚洲欧美日韩| 向日葵app在线观看下载大全视频| 黄色软件视频大全免费下载| 国产精品美女乱子伦高| eeuss影院www在线观看免费 | 欧美在线色视频| 亲密爱人之无限诱惑| 精品视频在线观看一区二区三区| 国产在线视频区| h视频在线观看免费观看| 在厨房被强行侵犯中文字幕| 一卡二卡三卡在线观看| 精品人妻少妇一区二区三区| 国产大学生粉嫩无套流白浆| 16女性下面无遮挡免费| 在线观看的网站| 一个人免费观看www视频| 手机小视频在线观看| 久久人人爽人人爽人人片AV东京热 |