2012-12-23 4 views
15

Javaの文字列は不変です。 int型とダブルC#で不変であるC#immutable 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を持ち、後でそれを変更すると、同じ変数によって新しい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

あなたは変更されていません(そしてに変更できません)。 new 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の値を持っている場合、そこには奇妙にする手立て、青いそれをペイントする方法はないというように。あなたがそれを変えようとすると、違う値になってしまいます(13)。その値を12を含む変数に格納するかもしれませんが、それは12のプロパティを変更しません。 12は以前とまったく同じままです。

2

これは明白なことかもしれませんが、私は、誰かが同じ混乱を抱えているかどうかを理解するのに役立ついくつかの行を追加します。

various kinds of mutabilityがありますが、一般的に「不変」と言われると、クラスには変更できないメンバーがあります。

文字列はおそらく配列にアクセスできず、メソッドで変更できない文字を格納している可能性があります。そのため、stringは不変です。文字列の操作+は常に新しい文字列を返します。

intは、おそらくアクセス不可能なメンバー "値"に値を格納している可能性があります。そのため、変更できません。 intのすべての演算はnew intを返し、この値は値型であるためvariableにコピーされます。