C# 擴(kuò)展方法

2018-01-22 17:09 更新

C# 擴(kuò)展方法

擴(kuò)展方法可以用新方法擴(kuò)展現(xiàn)有類型改變?cè)碱愋偷亩x。

擴(kuò)展方法是靜態(tài)類的靜態(tài)方法,其中this修飾符應(yīng)用于第一個(gè)參數(shù)。

第一個(gè)參數(shù)的類型將是擴(kuò)展的類型。

例如:


public static class StringExtension {
   public static bool IsCapitalized (this string s) {
      if (string.IsNullOrEmpty(s))
         return false;
      return char.IsUpper (s[0]);
   }
}

IsCapitalized擴(kuò)展方法可以被調(diào)用,就像它是一個(gè)字符串上的實(shí)例方法,如下所示:


Console.WriteLine ("Javascript".IsCapitalized());

一個(gè)擴(kuò)展方法調(diào)用被轉(zhuǎn)換回一個(gè)普通的靜態(tài)方法調(diào)用:


Console.WriteLine (StringExtension.IsCapitalized ("Javascript"));

接口也可以擴(kuò)展:


public static T First<T> (this IEnumerable<T> sequence){
    foreach (T element in sequence)
        return element;
    throw new InvalidOperationException ("No elements!");
}
...
Console.WriteLine ("Javascript".First()); // J


擴(kuò)展方法與實(shí)例方法

任何兼容的實(shí)例方法優(yōu)先于擴(kuò)展方法。

在以下示例中,Main的MyMethod方法將始終優(yōu)先 - 即使在使用int類型的參數(shù)x調(diào)用時(shí):


class Main {
   public void MyMethod (object x) { } 
}

static class Extensions {
   public static void MyMethod (this Main t, int x) { }
}

在這種情況下調(diào)用擴(kuò)展方法的唯一方法是通過(guò)正常的靜態(tài)語(yǔ)法:


Extensions.MyMethod(...)

擴(kuò)展方法與擴(kuò)展方法

如果兩個(gè)擴(kuò)展方法具有相同的簽名,則擴(kuò)展方法必須作為普通靜態(tài)方法調(diào)用,以消除調(diào)用方法的歧義。

如果一個(gè)擴(kuò)展方法具有更多特定的參數(shù),則更具體的方法優(yōu)先。

以下代碼顯示了如何使用它:


static class StringExtension {
    public static bool IsCapitalized (this string s) {...}
}
static class ObjectHelper {
    public static bool IsCapitalized (this object s) {...}
}

以下代碼調(diào)用StringExtension的IsCapitalized方法:


bool test1 = "Javascript".IsCapitalized();

要調(diào)用ObjectHelper的IsCapitalized方法,我們必須明確指定:


bool test2 = (ObjectHelper.IsCapitalized ("Javascript"));

類和結(jié)構(gòu)被認(rèn)為比接口更具體。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)