10

私は試した:

int i = 5;
object o1 = i; // boxing the i into object (so it should be a reference type)
object o2 = o1; // set object reference o2 to o1 (so o1 and o2 point to same place at the heap)

o2 = 8; // put 8 to at the place at the heap where o2 points

このコードを実行した後、o1 の値はまだ 5 ですが、期待していたのは 8 でした。

何か不足していますか?

4

5 に答える 5

20

これは、C# の変数のしくみではありません。ボクシングの値の型とは関係ありません。

このことを考慮:

object o1 = new object();
object o2 = o1;

o2 = new object();

なぜ同じオブジェクトへの参照を期待しo1、それo2を含むのでしょうか? を設定するときは同じですが、o2 = o1を設定するo2 = new object()と、 の値 (変数が指すメモリ位置) がo2変わります。

たぶん、あなたがやろうとしていることは次のようにすることができます:

class Obj {
    public int Val;
}

void Main() {
    Obj o1 = new Obj();
    o1.Val = 5;
    Obj o2 = o1;
    o2.Val = 8;
}

の最後にMain、 のValプロパティにo1が含まれます8

于 2012-11-30T19:18:02.010 に答える
5

やりたいことを行うには、値が参照型のプロパティである必要があります。

public class IntWrapper
{
    public int Value { get; set; }
    public IntWrapper(int value) { Value = value; }
}

IntWrapper o1 = new IntWrapper(5);
IntWrapper o2 = o1;

o2.Value = 8; 
于 2012-11-30T19:22:59.140 に答える
1

@ケンはあなたに完璧な答えを与えます。structこれは、 (値の型)で同じ動作を取得する方法です。

: 可変値型の動作は非常に直感的ではありません。自宅でこれを試してはいけません :)。

値の型で同様の動作を得るには、いくつかのインターフェイスを実装し、インターフェイスを介してプロパティを設定する必要があります。これstructは、独自の型にボックス化解除すると常にコピーが作成され、元の値を変更できないためです。

void TortureMutableBoxedValueType()
{
  object o1 = new IntWrapper(5);
  object o2 = o1;
  Console.WriteLine(((IValue)o1).Value); // outputs original 5
  ((IValue)o2).Value = 8; 
  Console.WriteLine(((IValue)o1).Value); // outputs new 8
}

interface IValue 
{
  int Value {get;set;}
}

// Don't use mutable value types - this is just sample.
public struct IntWrapper : IValue 
{
  int v;
  public int Value { get { return v;} set {v = value;}}
  public IntWrapper(int value) { v = value; }
}
于 2012-11-30T22:01:12.237 に答える
0

Joel が指摘しているように、ボックス化されていても値型であるため、参照されず、複製されます。これが、この結果が表示される理由です。o1 と o2 は異なるメモリ位置を指しています。

于 2012-11-30T19:22:49.847 に答える