W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
擴(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
任何兼容的實(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(...)
如果兩個(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)為比接口更具體。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: