コードにこれらの3つの行があります
int i = 5;
object a = i;
i += 1;
a の値も 6 になると思っていましたが、5 です。
実際どうなのかクリアしてください
コードにこれらの3つの行があります
int i = 5;
object a = i;
i += 1;
a の値も 6 になると思っていましたが、5 です。
実際どうなのかクリアしてください
あなたがするとき
object a = i;
整数i
は「ボックス化」され ( Boxing and Unboxing (C# リファレンス ガイド)も参照)、COPY がi
ボックスに入れられます。したがって、オリジナルi
を変更しても には影響しません。そのa
ため、検査時に変更されていないことがわかります。
値の型はコピーです。
値の型に基づく変数には、値が直接含まれます。 ある値型変数を別の値型変数に割り当てると、含まれている値がコピーされます。これは、オブジェクト自体ではなくオブジェクトへの参照をコピーする参照型変数の割り当てとは異なります。
代入演算子が正確にどのように機能するかは、値または参照型をコピーしているかどうかによって異なります。int などの基本型と構造体は値型ですが、オブジェクトは参照型です。
あなたがするとき:
int i = 5;
object a = i;
i += 1;
5 の値をスタックにコピーし、i というラベルを付けます。次に、オブジェクト a をヒープ上に作成し、それへの参照をスタックに配置し、i の値をオブジェクト a にコピーします。次に、i が 1 ずつインクリメントされます。ヒープ上のオブジェクト a の内容は変更されていません。
違いをより明確にする別の例を次に示します。
class test{
static void Main(string[] args)
{
Value i = new Value(5);
Value a = i;
i.number += 1;
Console.WriteLine(i.number);
Console.WriteLine(a.number);
}
}
public class Value
{
public Value(int x){number = x;}
public int number { set; get; }
}
この例の両方のオブジェクトは、数値の値として 6 を出力します。これは、a が i への参照になっているためです。オブジェクトが別のオブジェクトへの参照かどうかわからない場合は、いつでも ReferenceEquals() メソッドを使用できます。