C# 擴展方法

2018-01-22 17:09 更新

C# 擴展方法

擴展方法可以用新方法擴展現(xiàn)有類型改變原始類型的定義。

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

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

例如:


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

IsCapitalized擴展方法可以被調用,就像它是一個字符串上的實例方法,如下所示:


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

一個擴展方法調用被轉換回一個普通的靜態(tài)方法調用:


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

接口也可以擴展:


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


擴展方法與實例方法

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

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


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

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

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


Extensions.MyMethod(...)

擴展方法與擴展方法

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

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

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


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

以下代碼調用StringExtension的IsCapitalized方法:


bool test1 = "Javascript".IsCapitalized();

要調用ObjectHelper的IsCapitalized方法,我們必須明確指定:


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

類和結構被認為比接口更具體。

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號