2012-09-15 193 views

回答

3

因爲這是一個EXTENSION METHOD (EM)

擴展方法使你「增加」的方法,以現有的類型,而無需創建一個新的派生類型,重新編譯,或以其他方式修改原始類型。擴展方法是一種特殊的靜態方法,但它們被稱爲擴展類型上的實例方法。對於用C#和Visual Basic編寫的客戶端代碼,調用擴展方法和實際在類型中定義的方法之間沒有明顯區別。

例如:
字符串是.NET類型。在EM之前,如果不派生,則不能將自己的方法添加到字符串類型中。即使你是通過派生來實現的,該方法將被計爲派生類型的方法,而不是字符串類型。

但現在與EM的你可以這樣做,而不是從它得出。 EM的

要求(C#)

  1. 他們必須是public和static
  2. 它們所定義的類也是公共和靜態的。
  3. 最重要:第一個參數應該是您正在爲其創建EM的那種類型,並且應該在其前面有this關鍵字。沒有它,你的方法不會是EM,只會是一個靜態方法。

在早期scenaro您的EM NthIndexOf您在靜態類中定義現在StringExtender

public static class StringExtender 
{ 
    public static int NthIndexOf(this string target, string value, int n) 
    { 
     .... 
    } 
} 

,因爲第一個參數包含該字符串的前面,所以你可以把它作爲

int result = "My string".NthIndexOf("M", 0); 

如果它不是EM和像這樣的普通靜態方法

public static class StringExtender 
{ 
    public static int NthIndexOf(string target, string value, int n) 
    { 
     .... 
    } 
} 

話,就只好被稱爲像

int result = NthIndexOf("My string", "M", 0); 
+0

感謝詳細的解答。 – GoBeavs

+0

@OsuBrenden:永遠是一種享受。 –

5

因爲它是一個extension method (MSDN) - 注意到的第一參數之前關鍵字this

這可以讓你使用語法:

var result = "foo bar".NthIndexOf("o", 1); 

...就像您添加的NthIndexOf方法將System.String類型。這將在該靜態類的命名空間可用的任何地方可用(例如,using MyExtensions;)。

擴展方法必須聲明爲公共的非嵌套靜態類的靜態方法,但是可以在不使用擴展方法的情況下封裝相同的邏輯,在這種情況下,不需要使用靜態類&方法。