2014-01-09 126 views
5

這真的是我心中的疑問了點,我開始c#上編程。爲什麼System.Int32是結構和System.String是

爲什麼intstruct

enter image description here

而且stringclass

enter image description here

+2

首先,請閱讀是什麼struct'和'class'之間'的區別。第二,因爲'int'是'32位',這對'struct'來說是完美的。但是你無法知道'string' _can have_ .. –

回答

9

由於int具有固定的長度,而長度string是可變的。因此,編譯器可以保留一個固定的區域爲int S(主要在棧),並且它必須保持一個string S於堆char數組的柔性緩衝。

+0

如果例如「String」是一個值類型,那麼就有可能使它成爲一個值類型。包含一個'Char []'類型的字段。這種設計的優點是允許'default(String)'表現爲一個空字符串[如前面的COM框架中的情況]而不是空值,但會有缺點:只要字符串被轉換爲「Object」。 – supercat

2

int是值類型,而string是引用類型。值類型在傳遞給方法或將它們分配給新變量等時通過值(複製)傳遞。引用類型只能複製引用。

複製是快像整數或浮點數的小物件,但在某些時候在複製操作的成本變得昂貴,因此參考比複製的值的所有的時間是優選的。

雖然字符串也是不可改變的,最喜歡的值類型(是否有任何可變的值類型?),因爲字符串可以是相當大的,他們是不是按值傳遞一個很好的候選人。

+0

不完全如此。由於其關於長度的固有動態特性,編譯器無法爲字符串分配固定大小的內存塊。 –

+0

是的,可以有可變的值類型(你可以定義你自己的結構),但不是,這不是一個好主意。 –

+0

@ThomasWeller:'String'可能已被定義爲一個結構,其中包含一個專用字段,用於保存對某個可變大小對象的對象的引用,例如'Char []'永遠不會被修改。這樣的設計可以讓'default(String)'表現爲一個空字符串而不是一個空值,這可能會緩解爲COM編寫的代碼的移植,該代碼將全零位指針視爲一個空字符串的合法表示。然而,將這種字符串轉換爲「Object」將需要拳擊或特殊的框架「魔術」來避免拳擊。 – supercat