2013-07-26 110 views
1

儘管「String」是引用類型,但在VB.NET中,如果我們將參數作爲ByRef傳遞,我們只會得到使用引用類型的效果。因此,與C#不同,甚至VB.NET中的引用類型的默認行爲類似於值類型。爲什麼會有這種差異?引用類型在VB.NET中的行爲類似於值類型

+1

'字符串'以不同的方式實現:http://blogs.msdn.com/b/ericlippert/archive/2011/07/19/strings-immutability-and-persistence.aspx – Leri

+0

http://msdn.microsoft .com/en-us/library/vstudio/362314fe.aspx –

+2

你說的是不正確的。字符串是不可變的。它們仍然是引用類型,但由於您不能在創建字符串後修改字符串的內容,因此不能對其進行變異。 C#和VB.net在這個領域沒有相關的不同。如果你展示你的代碼讓你得出你在這個問題中陳述的結論,那也許會更好。然後我們會有更多的上下文。 –

回答

1

如果您試圖理解VB.NET和C#.NET中的引用類型和值類型及其差異,以字符串爲例,那麼您會迷惑自己很大的時間。

正如David所說,字符串是引用類型,但它們是特殊的,即不可變的。這意味着一旦你在引用地址上創建了一個字符串,你就不能修改它們。如果你嘗試這樣做,那麼.NET會將你修改過的字符串存儲在不同的地址上,並開始指向新地址。舊地址將在一段時間內收集垃圾。

例如

string str = "new string"; //One address space 
str = "modified" + str; //Different address and not same address as above 

而且,當你通過引用傳遞一個字符串的方法及修改的方法的字符串,它實際上只是指向一個不同的參考,但它使你覺得實際參考值會更新。

我希望這可以澄清你的問題。

+0

這有點誤導 - 字符串*不是特殊的。這只是其他任何參考類型。 *任何*引用類型都可以書寫,以便表現不變。你可能意思是說,但值得強調,因爲這不是大多數初學者很容易理解的。 –

+0

是的,這就是我的意思,但沒有提到「任何引用類型都可以寫成它的行爲不可改變」,只是爲了避免混淆。我還提到「特殊」,因爲在.net給出的所有類型中,只有字符串是一種不可變的類型(我認爲我在做這個聲明時是正確的)。當然,開發人員可以創建一個自定義的不可變類型,如果他/她想。無論如何感謝您指出。 :) – samar

1

不,System.String在C#中與VB.NET中的引用類型一樣多。然而,它有點特別;它沒有任何方法或屬性,可讓您更改字符串。

您只能分配一個字符串參考變量另一個字符串對象。它容易讓程序員感到困惑,因爲它的語法類似於你賦值類型值的方式;你很少使用新的運算符。你不必;分配文字不需要New。和System.String有很多方法,返回一個新的字符串對象;創建對象是在方法內部完成的。值得注意的是,使用Replace()方法並忘記使用返回值是一個非常常見的錯誤。

這種設計是非常有意的;它可以安全地將字符串作爲方法參數傳遞,而不會有被調用的方法會改變它的風險。並自動生成一個字符串線程安全。這兩個非常重要的屬性,這種常見的類型。

它確實有一個顯着的缺點;您的程序在使用字符串時往往會產生大量垃圾。因爲他們很少活得很久。沒關係;垃圾收集器是爲了優化這種情況而編寫的,並且它非常快速地執行第0代集合。 StringBuilder類是一個後備;它是可變的。