2010-12-06 61 views
5

我正在學習c#,有些東西我不明白,我一直無法找到關於在線的任何幫助。當使用teststring.Join而不是teststring.Split時,爲什麼我會得到「不能用實例引用訪問」? (c#)

string[] = testarray = { "test1", "test2", "test3" }; 
teststring = teststring.Join(" ", testarray); 

這失敗,出現以下錯誤消息:

會員 '的string.join(字符串,則params串[])' 不能以一個實例引用來訪問;相反,使用類型名稱來限定它。

如果我改變但它確實工作:

teststring = string.Join(" ", testarray); 

如果我不過使用功能拆分爲:

teststring = teststring.Split(new char[] {' '}); 

我不再收到一個錯誤。我認爲這與字符串類的某些功能是靜態的,而不是某些功能有關,但是我怎麼知道哪個功能是靜態的,哪些不是? (如果這是原因)

這些強制執行的靜態/非靜態調用技術是適應的。

回答

4

你說的是對的, String.Join是靜態的,但不是String.Split

我不再收到錯誤。我認爲這與字符串類的某些功能是靜態的,而不是某些功能有關,但是我怎麼知道哪個功能是靜態的,哪些不是? (如果這是原因)

您可以查看MSDN文檔。

例如,在String.Join的頁面上,每個方法的紫色框旁邊都有一個S;這表明該方法被聲明爲static。另外,如果你點擊一個特定的超載,你會看到聲明爲static的方法。例如,

public static string Join(
string separator, 
IEnumerable<string> values 
) 

然而,對於String.Split,不存在下一個要爲每個方法紫色方塊S。因爲沒有任何特定的重載是聲明爲static的方法。例如

public string[] Split(
params char[] separator 
) 
4

這是因爲Join是一個字符串的靜態方法。靜態方法總是使用類名稱調用,而不是該類實例的變量名稱。

+0

我是在正確的軌道上,然後,我怎麼能告訴我們,如果一個函數是靜態的還是不是說字符串? – 2010-12-06 16:05:39

+0

您尚未回答完整問題。 – 2010-12-06 16:13:31

6

您可以查看MSDN關於String class的文檔以獲取所有可用方法的列表。靜態方法有一個橙色的「S」圖標旁邊,而實例方法不這樣做,例如:

alt text

當考慮靜態和實例方法之間的區別,想想方法的功能是否依賴在一個特定的類的實例。
如果答案是肯定的,那麼它很可能作爲實例方法實現;如果不是,那很可能是一種靜態方法。
例如,Split方法將String類(調用它的字符串)的特定實例分隔成一個數組。
相比之下,Join方法就像是一種實用方法,可以調用它來組合由字符串分隔的數組,而無需首先創建String類的實例來調用它。

+0

您需要一個`string`的實例來充當連接字符串。所以我們可以想象`String.Join`不是靜態的,而是一個實例方法,並且被調用爲``,「。Join(strings)`。 – jason 2010-12-06 17:03:08

2

Join是String類的一個靜態方法,而Split是一個實例方法。要找出哪個是哪個,請右鍵單擊字符串並轉到定義。這將告訴你該類的定義(方法聲明等)

2

我會認爲它是因爲該方法不以任何方式與String參考直接相關,併爲了避免任何混淆,他們使它成爲一個而不是String的靜態方法,而拆分直接與您拆分該特定String實例有關。

1

這是一個完美的答案..它工作得很好..

靜態成員函數不屬於一類的特定實例,而是類的類型本身。因此,當您試圖訪問特定實例時,編譯器不允許這樣做。

能正確調用功能,你會寫

classname.methodname(參數)

而不是 類名CL =新類別名稱(); cl.methodname(parameter);

或刪除靜態修改。

欲瞭解更多請參考這個.. http://www.codeguru.com/forum/showthread.php?t=438550

相關問題