-3

コードにこれらの3つの行があります

int i = 5;
object a = i;
i += 1;

a の値も 6 になると思っていましたが、5 です。

実際どうなのかクリアしてください

4

3 に答える 3

2

あなたがするとき

object a = i;

整数iは「ボックス化」され ( Boxing and Unboxing (C# リファレンス ガイド)も参照)、COPY がiボックスに入れられます。したがって、オリジナルiを変更しても には影響しません。そのaため、検査時に変更されていないことがわかります。

于 2013-03-01T12:17:37.610 に答える
2

値の型はコピーです。

値の型に基づく変数には、値が直接含まれます。 ある値型変数を別の値型変数に割り当てると、含まれている値がコピーされます。これは、オブジェクト自体ではなくオブジェクトへの参照をコピーする参照型変数の割り当てとは異なります。

値の型(C# リファレンス)

于 2013-03-01T12:18:18.473 に答える
0

代入演算子が正確にどのように機能するかは、値または参照型をコピーしているかどうかによって異なります。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() メソッドを使用できます。

于 2013-03-01T12:48:09.610 に答える