2010-06-25 15 views
8

爲什麼String被設計爲引用類型而不是值類型?除了爲什麼System.String是一個引用類型而不是值類型的性能和可讀性之外,還有其他什麼原因嗎?

從建模的角度來看,我會將它建模爲一個值類型,因爲它代表沒有標識的東西。它沒有顯着的屬性。 (例如,我不能在一個字符串「a」和另一個字符串「a」之間做出任何區別)我知道,如果長字符串存儲在堆棧中,我會遇到嚴重的性能問題。可能這是不可能的,因爲字符串變得很長,因爲棧的大小是有限的。

如果不是爲了性能,爲什麼要將System.String設計爲引用類型? (假設任何可能的字符串最長16字節)

+3

我想你已經看到了潛在的重複的答案http://stackoverflow.com/questions/636932/in-c-why-is-string-a-reference-type-that-behaves-like-a -值類型 。然而,我不確定你在尋找什麼樣的答案:如果你正在討論.NET框架工程,那麼最大的原因(在另一個線程中給出的)是,字符串可以具有任何大小,並且可以容易地填充1MB堆棧 - 不僅導致性能問題,而且徹底打破框架。你需要一個比「沒有破壞的框架」更好的理由嗎? – 2010-06-25 07:42:25

+0

我正在從建模角度尋找答案。 (例如,我的答案是:我將它作爲參考類型進行建模,即使它不是用於性能和堆棧的,因爲......) – 2010-06-25 08:22:08

+3

但值類型甚至存在的唯一原因是性能。如果有人會建模一個純粹的OOP語言(比如SmallTalk),那麼他們將永遠不會使類型在行爲上顯着不同。而一個字符串和一個int都是對象。和蜜糖一樣慢,就像SmallTalk一樣。 – 2010-06-25 09:51:59

回答

2

結構需要爲固定大小。例如,想一想string[]。將string作爲值類型的唯一方法是隻存儲指針。這是本質上我們通過使用參考類型實現。

當然,它也是巨大有利的是,我們不會在每次分配字符串時都複製字符串。

1

我的理解是字符串是不可變類,而不是結構只有作爲性能增益。

字符串傾向於被創建,然後傳遞給許多對象,呈現給用戶或交給其他系統。在創建它們之後,字符串往往不會改變,因此將整個字符數組作爲唯一值複製到每個對象中幾乎沒有實用價值,並創建了大量臨時對象。

1

簡單 - 因爲我不想在每次將一個字符串傳入方法時都創建字符串副本。它需要更多的記憶,並且需要更多的時間。

+0

我相信OP說「除了表現」。 – 2010-06-26 01:40:07

5

正如你指出的,由於有限的堆棧空間和值類型的複製使用語義,有可能會變得非常巨大的值類型可能會被禁止。

另外,在.NET中實現字符串的方式在公式中添加了一些元素。字符串不僅是引用類型,它們也是不可變的(無論如何都在System命名空間之外),並且運行時使用實現來爲字符串做整潔的技巧。

所有這些增加了一些優點:重複的文字字符串只存儲一次,並且這種字符串的比較變得非常有效,因爲您可以比較引用而不是Unicode字符流。這些選項對於值類型是不可能的。

0

  • 〜編輯回答問題更準確地

的一點是,在許多語言,如String類型編碼爲Unicode的,所以它是不符合邏輯把它們看作是原始類型(如int),因爲它的二進制編碼與其人類閱讀形式之間沒有直接的對應關係。

Unicode層自動限定要從二進制抽取的字符串類型,而數字可以相對容易地在基本2(二進制)和基本10(十進制)表單之間互換

原始變量可以駐留在堆棧上的原因是有足夠的空間可用於很多數字。對於更多數據重型String類型,情況並非如此。

在字符串上執行的操作類型並非真正的算術,而是更多的基於布爾邏輯的(除非在計算字符串時將它們視爲向量或數組),因此爲其主要用途優化數據結構是有意義的,通過System.String命名空間。

0

根據公平性,您仍有可能將其視爲價值類型,並且運算符爲==

因此,如果有任何問題,將它作爲參考號是否恰當?

相關問題