15

Javaでは、文字列は不変です。文字列があり、それに変更を加えると、同じ変数によって参照される新しい文字列を取得します。

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

C#ではintとdoubleは不変であると言われています。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はどのように不変ですか?

4

3 に答える 3

21

マークの(完全に受け入れられる)答えをフォローアップするには:整数は不変ですが、整数変数は異なる場合があります。それが「変数」と呼ばれる理由です。

整数は不変です。数値が12の場合、それを奇妙にする方法や、青く塗る方法などはありません。たとえば、1を追加して奇妙にしようとすると、別の値13になります。おそらく、その値を、以前は12を含んでいた変数に格納しますが、12のプロパティは変更されません。 12は以前とまったく同じです。

于 2012-12-23T07:09:14.527 に答える
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*

ただし、ここには「ポインティング」はありません。構造体は直接スタック上にあります(この場合):参照は含まれません。

于 2012-12-23T06:46:18.180 に答える
2

これは明白に聞こえるかもしれませんが、誰かが同じ混乱を起こした場合に備えて理解するのに役立つ行をいくつか追加します。

可変性にはさまざまな種類がありますが、一般的に「不変」とは、クラスに変更できないメンバーがあることを意味します。

文字列はおそらく文字を配列に格納していますが、これにはアクセスできず、メソッドを介して変更することもできません。そのため、文字列は不変です。文字列に対する操作+は、常に新しい文字列を返します。

intはおそらくその値をメンバー「Value」に格納しているため、とにかくアクセスできません。そのため、変更することはできません。intに対するすべての操作は、新しいintを返します。この値は値型であるため、変数にコピーされます。

于 2012-12-23T22:04:12.633 に答える