我知道這個問題以前已經問過,但也有的提供非易怒的解釋,儘可能簡單地用laymen的話來說。
所有其他答案文件似乎有點遠,我
我知道這個問題以前已經問過,但也有的提供非易怒的解釋,儘可能簡單地用laymen的話來說。
所有其他答案文件似乎有點遠,我
我不認爲它會比從Wikipedia article的一句話簡單得多:
「擴展方法使您能夠‘添加’方法,以現有的類型,而無需創建一個新的派生類型,重新編譯,或者修改原始類型「。如果你得到一個定義爲
public class A
{
public void B()
{
Console.WriteLine("B called");
this.C();
}
public void C()
{
Console.WriteLine("C called");
}
}
但什麼:
public class A
{
public void C()
{
Console.WriteLine("C called");
}
}
而且要函數B添加到它
好,編程本質上是「易怒」,所以我會努力學習,就像你可以爲了瞭解文檔。但是,擴展方法僅允許您將方法的實例方法添加到現有的類中,否則這些類會被修改關閉。例如,如果我編寫了一個包含Foo
類型的庫並且未分發源代碼,則您將被卡住繼承它以添加任何功能,並且只有在我將該類型保留爲「未密封」時纔有可能。隨着擴展方法的出現,您可以向類中添加方法,您可以像調用任何其他方法一樣調用方法(實際上,它們是作爲靜態方法實現的,它會將一個隱藏的第一個參數應用於Foo
的實例,因此您仍然不會無法獲得班級的私人成員)。
擴展方法允許您將功能(方法)添加到無法訪問其源的類中。
擴展方法是一種在實際上模擬新方法而不實際更改類型定義本身的方法。
我想通俗一點的解釋是,它給每一種類型都是自己的隨從。他們本身並沒有被修改,他們只是憑藉與他們一起出遊的人獲得了許多新的能力。
+1爲非技術類比,雖然我不得不閱讀更多的時間比擴展方法的文檔;) – Town 2011-05-17 15:53:33
可以定義一個簡單的類?您可以使用擴展方法來做到這一點:
public class A
{
public void C()
{
Console.WriteLine("C called");
}
}
// the extensions class, can be any name, must be public
public class Extensions
{
public static void B( this A me)
//^must be public static^indicates extension^type to extend^name of variable instead of this
{
Console.WriteLine("B called");
// instead of this, you use the name of variable you used in the parameters
me.C();
}
}
現在,可以調用A.B()
,因爲它是第一個例子。
@Michael:我已投票結束這個問題。請參閱上述評論中的鏈接,它解釋了它的用法,我相信,你會發現它很簡單。 – shahkalpesh 2011-05-17 15:47:28
@邁克爾:如果你不這樣做,請隨時留下澄清答案的意見! – adamjford 2011-05-17 15:49:18
@shahkalpesh:我同意。如果這個鏈接沒有足夠的解釋擴展方法,那麼擴展方法可能就不行了;) – Town 2011-05-17 15:50:57