C# 擴(kuò)展方法

顧名思義,擴(kuò)展方法是附加方法。擴(kuò)展方法使您可以注入其他方法,而無需修改,派生或重新編譯原始類,結(jié)構(gòu)或接口??梢詫U(kuò)展方法添加到您自己的自定義類,.NET Framework類或第三方類或接口中。

擴(kuò)展方法的定義

擴(kuò)展方法是C# 3.0 中新增特性,可在不修改源類代碼情況,通過ADD File 模式對源代碼功能擴(kuò)展。

擴(kuò)展方法要求如下:

  • 擴(kuò)展方法需包含在 static 修飾類中。

  • 擴(kuò)展實現(xiàn)需是靜態(tài)形式。

  • 擴(kuò)展方法第一個參數(shù) 前綴為 this , 表示需要擴(kuò)展類對象,從第二個參數(shù)開始,為擴(kuò)展方法參數(shù)列表。

在以下示例中,IsGreaterThan()是int類型的擴(kuò)展方法,如果int變量的值大于提供的整數(shù)參數(shù),則返回true。

int i = 10;

bool result = i.IsGreaterThan(100); //返回FALSE

IsGreaterThan ()方法不是 int 數(shù)據(jù)類型的方法(Int32 struct)。它是程序員為 int 數(shù)據(jù)類型編寫的擴(kuò)展方法。通過包含定義 IsGreaterThan ()擴(kuò)展的命名空間,IsGreaterThan ()擴(kuò)展方法將在整個應(yīng)用程序中可用。

 擴(kuò)展方法在Visual Studio的intellisense中具有特殊符號,因此您可以輕松區(qū)分類方法和擴(kuò)展方法。

擴(kuò)展方法圖標(biāo)
Visual Studio智能感知中的擴(kuò)展方法符號

編寫擴(kuò)展方法

現(xiàn)在讓我們看看如何編寫擴(kuò)展方法。

LINQ建立在對IEnumerable和IQeryable類型進(jìn)行操作的擴(kuò)展方法上。

擴(kuò)展方法實際上是在靜態(tài)類中定義的一種特殊的靜態(tài)方法。要定義擴(kuò)展方法,首先,定義一個靜態(tài)類。

例如,在以下示例中,我們在 ExtensionMethods 命名空間下創(chuàng)建了一個類 IntExtensions。IntExtensions 類將包含適用于int數(shù)據(jù)類型的所有擴(kuò)展方法。(您可以為命名空間和類使用任何名稱。)

namespace ExtensionMethods
{
    public static class IntExtensions
    {

    }
}

現(xiàn)在,將靜態(tài)方法定義為擴(kuò)展方法,其中擴(kuò)展方法的第一個參數(shù)指定了適用擴(kuò)展方法的類型。我們將在int類型上使用此擴(kuò)展方法。因此,必須在第一個參數(shù) int 之前加上this 修飾符。

例如,IsGreaterThan()方法對int進(jìn)行操作,因此第一個參數(shù)為this int i。

namespace ExtensionMethods
{
    public static class IntExtensions
     {
        public static bool IsGreaterThan(this int i, int value)
        {
            return i > value;
        }
    }
}

現(xiàn)在,您可以將 ExtensionMethods 命名空間包含在任何希望使用此擴(kuò)展方法的地方。

使用擴(kuò)展方法

using ExtensionMethods;

class Program
{
    static void Main(string[] args)
    {
        int i = 10;

        bool result = i.IsGreaterThan(100); 

        Console.WriteLine(result);
    }
}
輸出:
false
常規(guī)靜態(tài)方法和擴(kuò)展方法之間的唯一區(qū)別是,擴(kuò)展方法的第一個參數(shù)指定其將要對運算符進(jìn)行操作的類型,其后跟 this 關(guān)鍵字。

擴(kuò)展方法的原則總結(jié)

  1. C#只支持?jǐn)U展方法,不支持?jǐn)U展屬性、擴(kuò)展事件、擴(kuò)展操作符等。

  2. 擴(kuò)展方法(第一個參數(shù)前面是this的方法)必須在非泛型的靜態(tài)類中聲明,擴(kuò)展方法必須有一個參數(shù),而且只有第一個參數(shù)使用this標(biāo)記。

  3. C#編譯器查找靜態(tài)類中的擴(kuò)展方法時,要求這些靜態(tài)類本身必須具有文件作用域。

  4. C#編譯要求“導(dǎo)入”擴(kuò)展方法。(靜態(tài)方法可以任意命名,C#編譯器在尋找方法時,需要花費時間進(jìn)行查找,需要檢查文件作用域中的所有的靜態(tài)類,并掃描它們的所有靜態(tài)方法來查找一個匹配)

  5. 多個靜態(tài)類可以定義相同的擴(kuò)展方法。
    用一個擴(kuò)展方法擴(kuò)展一個類型時,同時也擴(kuò)展了派生類型。

擴(kuò)展方法聲明

  • 必須在一個非嵌套的、非泛型的靜態(tài)類中(所以必須是一個靜態(tài)方法)

  • 至少有一個參數(shù)。

  • 第一個參數(shù)必須附加this關(guān)鍵字做前綴。

  • 第一個參數(shù)不能有其他任何修飾符(如ref或out)。

  • 第一個參數(shù)的類型不能是指針類型。

要記住的要點

  • 擴(kuò)展方法是最初不包含在類中的其他自定義方法。

  • 擴(kuò)展方法可以添加到自定義,.NET Framework或第三方類,結(jié)構(gòu)或接口。

  • 擴(kuò)展方法的第一個參數(shù)必須是適用擴(kuò)展方法的類型,其后跟this關(guān)鍵字。

  • 通過包含擴(kuò)展方法的名稱空間,可以在應(yīng)用程序中的任何位置使用擴(kuò)展方法。

丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清