国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

C#3.0 中的擴展方法 (Extension Methods)

2019-11-18 16:32:07
字體:
來源:轉載
供稿:網友

擴展方法的定義,需要注意三個部分:1、靜態(tài)類(私有公共都可以);2、靜態(tài)方法(私有公共都可以);3、第一個函數參數前帶 this(必須是第一參數前)

namespace Hongjun.Guo
{
    static class MyExtensionMethods
    {
        internal static void PRint(this object s)
        {
            Console.WriteLine(s);
        }
    }
}

擴展方法的使用,需要注意點: using 你定義所在的命名空間。

using Hongjun.Guo;

static void Main(string[] args)
{
    object o = "dsdgs";
    o.Print();
}

這樣一個簡簡單單的代碼后,我們就可以很方便的對一些不開源的第三方控件增加很多我們自己額外需要的功能。

 

擴展方法的使用,有時候并不是這么簡簡單單,我們來看一些特殊情況,通過這些特殊情況的分析,我們可以更深入的了解擴展方法:

 

情況一 : 擴展方法跟原來類的方法重名時候的處理邏輯。

場景:我們是對一個第三方的沒有開放源代碼組件的一個類擴展了一個方法,比如方法: Print 。過了一段時間后,這個第三方的組件發(fā)布了新版本,該類的增加了 Print 方法。這時候會出何種效果??

問題演示代碼:

namespace Hongjun.Guo
{

    public class MyClass
    {
        public void Print()
        {
            Console.WriteLine("****");
        }
    }

    static class MyExtensionMethods
    {
        internal static void Print(this MyClass s)
        {
            Console.WriteLine("haha " + s.ToString());
        }

    }

}

調用范例:

using Hongjun.Guo;

static void Main(string[] args)
{
    MyClass o = new MyClass();
    o.Print();

    Console.ReadLine();
}

這時候我們會看到何種結果呢??

答案:看到的是 ****

也就是,擴展方法跟類的方法沖突時候,編譯使用不會報任何錯誤,這時候以類的方法優(yōu)先級最高,這時我們使用類的方法,而不是擴展方法。

 

分析:

我們把上述兩組代碼編譯后,再反編譯成IL,我們就可以看到,實際上,擴展方法在IL層上是不存在的。

擴展方法實際是編譯器調用某個類的某個方法的時候,先去這個類找,如果有這個方法,則就調用;如果找不到,根據引用的命名空間,再去找擴展方法(靜態(tài)類的靜態(tài)方法)。找到,就使用,找不到當然就編譯錯誤了。

根據這個分析結果,我們就可以理解上述問題處理的結果了。

 

情況二: 擴展方法的嵌套

比如我們有如下擴展方法。

namespace Hongjun.Guo
{
    static class MyExtensionMethods
    {
        public static int Test01(this int i)
        {
            return i * 3;
        }

        public static int Test02(this int i)
        {
            return i + 5;
        }
    }
}

下面是調用范例:

static void Main(string[] args)
{
    int mm = 7;
    Console.WriteLine(mm.Test01().Test02());
    Console.WriteLine("*****");
    Console.WriteLine(mm.Test02().Test01());

    Console.WriteLine("*****");

    Console.WriteLine(MyExtensionMethods.Test02(MyExtensionMethods.Test01(mm)));


    Console.ReadLine();
}

 

問,調用的顯示結果是何值?

答案: 依次顯示: 26,36,26

分析:

mm.Test01().Test02()

這行代碼編譯后相當于如下代碼:

MyExtensionMethods.Test02(MyExtensionMethods.Test01(mm))

這兩行代碼在編譯后的IL中是完全一樣的。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 白水县| 蓬溪县| 栖霞市| 岑巩县| 晋州市| 司法| 建平县| 苏尼特右旗| 广宗县| 北碚区| 华安县| 疏附县| 新营市| 成武县| 台中县| 勃利县| 新丰县| 尼玛县| 武强县| 和林格尔县| 牡丹江市| 荔波县| 长宁县| 渭南市| 新田县| 星子县| 绥江县| 鹤山市| 林甸县| 广安市| 顺义区| 舞阳县| 乌审旗| 岳池县| 香港 | 堆龙德庆县| 平南县| 云林县| 景谷| 陕西省| 临猗县|