如果這個問題太簡單,我提前致歉。爲什麼這裏需要靜態
爲什麼在下面的鏈接中找到的方法NthIndexOf需要靜態類和靜態類成員?
C# - indexOf the nth occurrence of a string?
如果這個問題太簡單,我提前致歉。爲什麼這裏需要靜態
爲什麼在下面的鏈接中找到的方法NthIndexOf需要靜態類和靜態類成員?
C# - indexOf the nth occurrence of a string?
因爲這是一個EXTENSION METHOD (EM)。
擴展方法使你「增加」的方法,以現有的類型,而無需創建一個新的派生類型,重新編譯,或以其他方式修改原始類型。擴展方法是一種特殊的靜態方法,但它們被稱爲擴展類型上的實例方法。對於用C#和Visual Basic編寫的客戶端代碼,調用擴展方法和實際在類型中定義的方法之間沒有明顯區別。
例如:
字符串是.NET類型。在EM之前,如果不派生,則不能將自己的方法添加到字符串類型中。即使你是通過派生來實現的,該方法將被計爲派生類型的方法,而不是字符串類型。
但現在與EM的你可以這樣做,而不是從它得出。 EM的
要求(C#)
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);
因爲它是一個extension method (MSDN) - 注意到的第一參數之前關鍵字this
。
這可以讓你使用語法:
var result = "foo bar".NthIndexOf("o", 1);
...就像您添加的NthIndexOf
方法將System.String
類型。這將在該靜態類的命名空間可用的任何地方可用(例如,using MyExtensions;
)。
擴展方法必須聲明爲公共的非嵌套靜態類的靜態方法,但是可以在不使用擴展方法的情況下封裝相同的邏輯,在這種情況下,不需要使用靜態類&方法。
這是一個需要static關鍵字的extension method。
感謝詳細的解答。 – GoBeavs
@OsuBrenden:永遠是一種享受。 –