1

構造体が値型でクラスが参照型であることは知っていますが、次のコードを実行すると、なぜ2つの異なる答えが得られるのですか

誰でも少し説明できますか

[struct|class] values {
    public int x, y;

    public values (int x, int y) {
        this.x = x;
        this.y = y;
    }
}

values v = new values(12, 13);
object o = v;
v.x = 2;
Console.WriteLine(((values)o).x);

出力

いつ

  1. それはクラスです:出力は2です

  2. それは構造体です:出力は12です

誰でも私を説明できますか?

ありがとう

4

4 に答える 4

9

structorに対して非常に異なる動作をする 1 つの行classは、

  object o = v;
  • Valuesが参照型の場合、参照oのコピーになりますv。のインスタンスはまだ 1 つしかありませんValues

  • Valuesが値型の場合o、インスタンス自体のボックス化されたコピーへの参照になります。この場合、割り当てによって 2 番目のインスタンスが作成され、元のインスタンスで実行v.x = 2されます。コピーは影響を受けません。

あなたの例にはボクシングが含まれていますが、これは不要な複雑さです。使用values o = v;すると同じ出力が得られます。次に、行はボックス化なしで通常のコピー (2 番目のインスタンス) を作成します。

要約すると、値と参照型の主な違いはコピー セマンティクスにあります。x = y単純な割り当て ( ) とパラメーターの受け渡し ( )では異なる動作に気付くでしょうfoo(x)

変更可能な値の型を使用すると、問題が発生することが予想されます。演習として、クラスまたは構造体で 何f.Myvalue.x = 2;が行われるかを確認してくださいValues

 class Foo { public Values MyValue  { get; set; } }
于 2013-08-14T12:20:36.483 に答える
1

キーラインは

object o = v;

値が構造体 (または値型) の場合、ボックス化値が発生します。これによると(そのリンクをたどると、最後に質問を正確に見つけることができます:))

値型の値のボックス化は、オブジェクト インスタンスの割り当てと、値型の値のそのインスタンスへのコピーで構成されます。

したがって、v の値は ですcopied。ここで開梱すると

Console.WriteLine(((values)o).x);

後ではなく、元のv値を取得しますv

v.x = 2;

したがって、構造体 (または値型) の答えは です12

クラス (または参照型) の場合は非常に単純です。ボクシングではなく、オブジェクトにキャストするだけなので、次にこのオリジナルを操作vして値を変更します。

于 2013-08-14T12:28:11.233 に答える