2013-12-23 26 views
13

這是我最後一次採訪瞭如何去類:字符串VS當兩個是引用類型

問:在哪裏存儲的字符串?

答:堆,因爲它是引用類型

問:解釋我這下面的代碼:

static void Main(string[] args) 
{ 
    string one = "test"; 
    string two = one; 
    one = one + " string"; 

    Console.WriteLine("One is {0}" , one); 
    Console.WriteLine("Two is {0}", two); 
} 

答:像下面德魯兩個圖表:

(代表聲明,string two = one;

enter image description here

(代表聲明,one = one + " string";。一個新的字符串在堆上創建和分配)

enter image description here

問:正確的。畫出下面的代碼片段相似:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Test one = new Test { someString = "test" }; 
     Test two = one; 
     one.someString = "test String"; 

     Console.WriteLine("One is {0}", one.someString); 
     Console.WriteLine("Two is {0}", two.someString); 
    } 
} 

class Test 
{ 
    public string someString { get; set; } 
} 

答:

[Test two = one] enter image description here

one.someString = "test String"; 

enter image description here

問:確定。你說stringsclasses都是參考類型。那麼爲什麼要創建一個新的字符串對象並賦值,而對於類,現有的字符串屬性本身會被修改?

答案:因爲字符串是不可變的,而類是可變的。爲什麼類的設計者在保持字符串不可變的情況下使其變爲可變的?爲什麼在任何地方都有很多有用的答案,但是任何人都可以通過這種方式簡化用上面的代碼解釋這個特定行爲?)

+2

[爲什麼.NET字符串是不可變的?](http://stackoverflow.com/questions/2365272/why-net-string-is-immutable)有趣的閱讀,而不是試圖解決任何關於類不變性的觀點。 –

+0

http://stackoverflow.com/questions/4274193/what-is-the-difference-between-a-mutable-and-immutable-string-in-c – Nahum

+0

http://stackoverflow.com/questions/93091/why -cant-strings-be-mutable-in-java-and-net – Nahum

回答

4

使字符串變得不可變的原因之一,即使它們是引用類型,也是爲了使它們看起來像原始類型(例如,int,double,float)。

這也是字符串是唯一可以表示爲文字的引用類型的原因(例如,"some string")。許多其他語言採用相同的方法,例如Java。

0

字符串共享緩衝區。在你的情況下,如果一個和兩個是字符串,它們將是單獨的對象(堆上的兩個對象),但在內部它們將指向相同的緩衝區(堆上的第三個對象)。

3

字符串是不可變的,因爲邏輯上,它們是單個值,並且可變將導致很多意外的行爲。

然而,字符串價值類型,因爲他們往往左右了很多,這將需要大量的值複製的傳遞。這將變得相當昂貴,特別是對於大型琴絃。

所以爲了獲得兩全其美的好處,.Net中的字符串是引用類型,但也是不可變的。

1

命令one = ...將名爲one的指針* 設置爲新值。由於two是不同的指針,它保留了它的原始值。

命令one.someString = ...修改對象onetwo仍然是一個不同的指針,但由於它指向同一個對象,所以修改在它們之間共享。

相關問題