2012-12-23 37 views
15

在Java中,字符串是不可變的。如果我們有一個字符串,並進行更改,我們獲得由同一個變量引用新的字符串:C#不可變int

String str = "abc"; 
str += "def"; // now str refers to another piece in the heap containing "abcdef" 
       // while "abc" is still somewhere in the heap until taken by GC 

It's been said是int和double在C#中不可改變的。這是否意味着當我們有int並且稍後改變它時,我們會得到由同一個變量「指向」的新int?同樣的事情,但與堆棧。

int i = 1; 
i += 1; // same thing: in the stack there is value 2 to which variable 
     // i is attached, and somewhere in the stack there is value 1 

這是正確的嗎?如果不是,那麼int是不可變的?

+8

爲了完整起見,.NET字符串也不可改變。 –

回答

16

你一點都沒變(和不能變化)一些關於INT;您已分配一個新的 int值(並丟棄舊值)。因此它是不可變的。

考慮一個更復雜的結構:

var x = new FooStruct(123); 
x.Value = 456; // mutate 
x.SomeMethodThatChangedInternalState(); // mutate 

x = new FooStruct(456); // **not** a mutate; this is a *reassignment* 

然而,沒有 「指點」 在這裏。該結構直接在堆棧上(在這種情況下):不涉及引用。

+0

謝謝,現在我明白了! –

21

要跟進馬克的(完全可以接受的)答案:整數是不可變的,但整數變量可能會有所不同。 這就是爲什麼他們被稱爲「變量」。

整數是不變的:如果你有一個是12號的價值,有沒有辦法讓它奇怪,沒有辦法把它漆成藍色,等等。如果你試圖通過添加一個來使它變得奇怪,那麼你最終會得到一個不同的值,也許你將該值存儲在曾經包含12的變量中,但是這不會改變任何12的屬性。 12保持與以前完全一樣。

2

儘管這聽起來很明顯我將添加一對夫婦的幫助我瞭解的情況下,有人有同樣的困惑線。

various kinds of mutability但通常,當人們說「不可改變的」他們的意思是類有一個不能改變的成員。

字符串可能是存儲在數組,這是無法訪問,無法通過方法來改變人物,這就是爲什麼字符串是不可改變的。字符串操作總是返回一個新的字符串。

int值可能將其存儲在會員「價值」,這無論如何是無法訪問的價值,這就是爲什麼不能改變。對int的所有操作都會返回新的int,並將此值複製到變量,因爲它是一個值類型。