3

私はこれを尋ねるのはかなり無知だと感じますが、なぜこれが起こっているのか誰かが私に説明することができますか?

class MyClass {public int i {get; セットする; }}
クラスプログラム
{{
    static void Main(string [] args)
    {{
        MyClass a = new MyClass();
        MyClass b = new MyClass();

                bi = 2;
        a = b;
        ai = 1;

        Console.Write(bi + "\ n"); //出力1
    }
}

これは、ポインターなどの優れた機能を使用している場合には理にかなっていますが、C#を使用すると、「b」は「a」から独立したままになるという印象を受けました。

私はひどく悪い習慣を使っているだけですか?たぶん誰かが私をC#でなぜそうなのかを説明する何かに向けることができますか?

ありがとう。

4

6 に答える 6

10

あなたが混乱しているのはこの行です:

a = b;

b値によってにコピーされることを期待していましたが、実際には、からへaの参照を割り当てただけです。ba

.Netは、世界を2つのカテゴリに分類します。参照型と値型です(デリゲート型と他のいくつかの型もありますが、それは別の話です)。定義するクラスはすべて参照型であり、参照型について覚えておくべき重要なことがいくつかあります。

  • ディープコピーを行うための組み込みの方法はありません
  • 等しいことを注意深くチェックしてください。==は参照の同等性(変数は同じオブジェクトを参照します)を.Equals()目的としていますが、値の同等性を目的としています。これを正しく行うには、型の.Equals()(およびGetHashCode())をオーバーライドする必要があります。
  • 割り当ては参照をコピーするだけです(これはあなたを噛む部分です)
于 2010-01-21T23:02:38.223 に答える
4

あなたはファッションの後にポインターを使用しています。オブジェクトは、 ValueTypeの子孫でない限り、参照によって参照されます。

それで

a = b;

a参照をへの参照と等しく設定しますb

于 2010-01-21T23:02:20.007 に答える
2

このシナリオについて理解する必要があるのは、実際には4つの対象エンティティがあるということです。

  1. MyClassのインスタンス#1
  2. MyClassのインスタンス#2
  3. MyClassリファレンスa
  4. MyClassリファレンスb

最初に、参照aはインスタンス#1を参照し、参照bはインスタンス#2を参照します。それはあなたが行を実行するまでですa=b;。この行の後、参照aと参照bの両方がインスタンス#1を指しています。したがって、呼び出すb.iときは、実際にインスタンス#1に値が何であるかを尋ねていますi。インスタンス#2ではありません。

于 2010-01-21T23:03:50.507 に答える
1

ポインタがないことは、オブジェクトへの参照がないことと同じではありません。あなたの場合、「a」はタイプMyClassの特定のオブジェクトへの参照であり、「b」も同様です。'a = b'を実行すると、オブジェクトではなく参照がコピーされるため、'a'は'b'と同じオブジェクトを指します。

于 2010-01-21T23:03:45.357 に答える
0

aとbは参照であるため、行の後、aはa = bbと同じオブジェクトを参照します(そして、aが最初に指していたオブジェクトはもう到達できません)。したがって、設定a.iすると、bによって参照されるオブジェクトも更新されるため、変更されます。

于 2010-01-21T23:04:56.927 に答える
0

.NETのすべてのクラスは参照型です。これは、新しいインスタンスを作成するときに、メモリ内の参照を指し、その値を保持しないことを意味します。

あなたの場合、(割り当て)を使用するときは、オブジェクトalsto= operatorのポインタをオブジェクトのポインタに関連付けるだけです。この操作の後、オブジェクト上のすべてのインタラクションは、同じものを指しているだけなので、他のオブジェクトに反映されます。ab

オブジェクトを複製する必要がある場合は、自分でコードを作成する必要があります。しかし、これは別の話です。

于 2017-09-21T09:20:05.660 に答える