顧名思義,擴(kuò)展方法是附加方法。擴(kuò)展方法使您可以注入其他方法,而無需修改,派生或重新編譯原始類,結(jié)構(gòu)或接口??梢詫U(kuò)展方法添加到您自己的自定義類,.NET Framework類或第三方類或接口中。
擴(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ò)展方法。
現(xià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ò)展方法的地方。
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)鍵字。
C#只支持?jǐn)U展方法,不支持?jǐn)U展屬性、擴(kuò)展事件、擴(kuò)展操作符等。
擴(kuò)展方法(第一個參數(shù)前面是this的方法)必須在非泛型的靜態(tài)類中聲明,擴(kuò)展方法必須有一個參數(shù),而且只有第一個參數(shù)使用this標(biāo)記。
C#編譯器查找靜態(tài)類中的擴(kuò)展方法時,要求這些靜態(tài)類本身必須具有文件作用域。
C#編譯要求“導(dǎo)入”擴(kuò)展方法。(靜態(tài)方法可以任意命名,C#編譯器在尋找方法時,需要花費時間進(jìn)行查找,需要檢查文件作用域中的所有的靜態(tài)類,并掃描它們的所有靜態(tài)方法來查找一個匹配)
多個靜態(tài)類可以定義相同的擴(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ò)展方法。