儘管「String」是引用類型,但在VB.NET中,如果我們將參數作爲ByRef傳遞,我們只會得到使用引用類型的效果。因此,與C#不同,甚至VB.NET中的引用類型的默認行爲類似於值類型。爲什麼會有這種差異?引用類型在VB.NET中的行爲類似於值類型
回答
如果您試圖理解VB.NET和C#.NET中的引用類型和值類型及其差異,以字符串爲例,那麼您會迷惑自己很大的時間。
正如David所說,字符串是引用類型,但它們是特殊的,即不可變的。這意味着一旦你在引用地址上創建了一個字符串,你就不能修改它們。如果你嘗試這樣做,那麼.NET會將你修改過的字符串存儲在不同的地址上,並開始指向新地址。舊地址將在一段時間內收集垃圾。
例如
string str = "new string"; //One address space
str = "modified" + str; //Different address and not same address as above
而且,當你通過引用傳遞一個字符串的方法及修改的方法的字符串,它實際上只是指向一個不同的參考,但它使你覺得實際參考值會更新。
我希望這可以澄清你的問題。
這有點誤導 - 字符串*不是特殊的。這只是其他任何參考類型。 *任何*引用類型都可以書寫,以便表現不變。你可能意思是說,但值得強調,因爲這不是大多數初學者很容易理解的。 –
是的,這就是我的意思,但沒有提到「任何引用類型都可以寫成它的行爲不可改變」,只是爲了避免混淆。我還提到「特殊」,因爲在.net給出的所有類型中,只有字符串是一種不可變的類型(我認爲我在做這個聲明時是正確的)。當然,開發人員可以創建一個自定義的不可變類型,如果他/她想。無論如何感謝您指出。 :) – samar
不,System.String在C#中與VB.NET中的引用類型一樣多。然而,它有點特別;它沒有任何方法或屬性,可讓您更改字符串。
您只能分配一個字符串參考變量另一個字符串對象。它容易讓程序員感到困惑,因爲它的語法類似於你賦值類型值的方式;你很少使用新的運算符。你不必;分配文字不需要New。和System.String有很多方法,返回一個新的字符串對象;創建對象是在方法內部完成的。值得注意的是,使用Replace()方法並忘記使用返回值是一個非常常見的錯誤。
這種設計是非常有意的;它可以安全地將字符串作爲方法參數傳遞,而不會有被調用的方法會改變它的風險。並自動生成一個字符串線程安全。這兩個非常重要的屬性,這種常見的類型。
它確實有一個顯着的缺點;您的程序在使用字符串時往往會產生大量垃圾。因爲他們很少活得很久。沒關係;垃圾收集器是爲了優化這種情況而編寫的,並且它非常快速地執行第0代集合。 StringBuilder類是一個後備;它是可變的。
- 1. 引用類型.NET中的值類型
- 2. 使值類型的行爲類似於使用裝箱和隱式轉換的引用類型
- 3. 字符串的行爲類似於值類型
- 4. VB.NET值類型的「類」被轉換爲「類型」
- 5. c#值類型和引用類型
- 6. 引用類型與值類型
- 7. 值類型字段是引用類型?
- 8. 爲什麼字符串的行爲類似於值類型,而使用==
- 9. 用戶定義的值類型具有類似於本地值類型的類型轉換
- 10. 如何分配引用類型類中的值類型屬性?
- 11. 在C#中,使用的值類型與引用類型
- 12. Mono.Cecil類型引用類型?
- 13. 確定類型是引用類型還是值類型
- 14. 在VB.NET中強類型的字典類
- 15. 不能爲索引類型爲'String'的類型'[String:AnyObject]'下標值
- 16. 在Swift中是一個值類型或引用類型?
- 17. VB.NET弱類型?強類型的?
- 18. 類似於C++模板中的C#泛型類型演繹?
- 19. 在Java中用於聯合類似類型的哈希碼
- 20. 將值類型數組轉換爲引用類型數組
- 21. VB.NET指針值類型
- 22. 泛型類VB.NET
- 23. PHPUnit - 存根類似於構建類型
- 24. 對於引用類型和加載類型,IsSubClassOf的不同行爲
- 25. Swift中的值類型和引用類型
- 26. javascript中的值類型引用類型對象
- 27. 更好地理解Swift中的引用類型和值類型
- 28. 對於引用類型
- 29. oop行爲類似構造函數參數類型的類
- 30. 結構和類/值類型與引用類型
'字符串'以不同的方式實現:http://blogs.msdn.com/b/ericlippert/archive/2011/07/19/strings-immutability-and-persistence.aspx – Leri
http://msdn.microsoft .com/en-us/library/vstudio/362314fe.aspx –
你說的是不正確的。字符串是不可變的。它們仍然是引用類型,但由於您不能在創建字符串後修改字符串的內容,因此不能對其進行變異。 C#和VB.net在這個領域沒有相關的不同。如果你展示你的代碼讓你得出你在這個問題中陳述的結論,那也許會更好。然後我們會有更多的上下文。 –