2

始める前に、この質問に「答える」質問が他にもいくつかあることを認識していますが、完全に理解できる方法ではありません。これが私が言及しているものです: C#でのディープコピー

C# でのコピーがひどいアイデアである理由

私はかなりの調査を行いましたが、オブジェクトを別のオブジェクトの値に設定する方法を誰かが説明してくれることを望んでいました。

たとえば、次のように言いましょう。

myObject bob;
bob = new myObject();
myObject joe
joe = bob

私が調査できることから、joeボブの のインスタンスを指すようになりbobました。これらのオブジェクトはまだ独立して動作しますか?

2 つのオブジェクトを作成し、その内容を別のオブジェクトにコピーして、フィールド、メソッド、およびイベントが別々に発生する2 つの別個のオブジェクトにするにはどうすればよいでしょうか?

もう一度この質問をして申し訳ありませんが、他のどこにも私にとって意味のある説明が見つからないようです.

4

4 に答える 4

6

両方とも同じインスタンスを指します。2 つの別個のインスタンスが必要な場合は、new演算子を使用して 2 番目のインスタンスを作成します。

于 2013-10-16T19:39:53.357 に答える
3

各行を見てみましょう:

myObject bob; // Creates a variable of type myObject, but it doesn't point anywhere
bob = new myObject(); // bob now points to a newly created myObject instance
myObject joe; // Creates a variable of type myObject, but it doesn't point anywhere
joe = bob; // joe now refers to the same object as bob

覚えておくべき重要なことは、最後の行が参照自体の値をコピーすることです。bob1000番地を指す場合などは、joeそこも指します。したがって、このアドレスのデータを変更joeすると、との両方bobが同じデータを指します。

ただし、他の場所を指すように設定joeしても問題ありません。影響はありません。言い換えると:bob

joe = null; // This will not null out bob

のまったく新しいインスタンスを作成する場合はmyObject、次のようにする必要があります。

joe = new myObject(); // This will also not affect bob

myObjectここで、メモリ内の新しいインスタンスを作成し、既存のインスタンスのすべてのプロパティをコピーしようとしている場合は、自分でこれを行う必要があります。

joe = new myObject();
joe.X = bob.X; // Assuming X is not a reference itself
joe.Y = bob.Y; // ...or you'd have to do this recursively

.NET では、このコピーを行う方法は提供されていません。1 つの一般的なパターンはmyObject()、 のインスタンスを取り、myObjectそのすべてのプロパティをコピーするコンストラクターを作成することです。

joe = new myObject(bob);
于 2013-10-16T19:41:57.163 に答える
2

はい、両方bobともjoeまったく同じオブジェクトを指しています。

オブジェクトのコピーは、クラスごとに行う必要があります。値の型 (いくつかの int と文字列) のみを持つクラスがあるとします。そのすべてのフィールドをコピーすると、問題なく機能します。

しかし、クラスが他のオブジェクトへの参照を保持している場合を想像してください (可能性は高いです)。このオブジェクトをフィールドごとにコピーすると、いくつかのデータ (開いているファイル、ネットワーク ソケットなど) を共有する 2 つの異なるインスタンスができます。したがって、オブジェクトを確実にコピーするには、そのオブジェクトが保持するデータの種類を知っているため、そのオブジェクトにそれ自体のコピーを作成させる必要があります。

答えは、C# でオブジェクトをコピーする安全な一般的な方法がないということです。

于 2013-10-16T19:42:28.077 に答える
2

ここでデータとメソッドを混同しています。データは、オブジェクトが何であるかを定義します。たとえば、A circleof radius2。メソッドはそのデータに作用します。たとえばIncreaseRadius()、コピーすると、メソッドではなく、このデータがコピーされます。メソッドは単にクラス データを操作し、クラス データに固有の出力を生成します。

いいえ。どちらも同じオブジェクトを指しています。メモリ内の同じオブジェクトへの参照を保持している2つの変数だけですbobjoeを介してデータを変更しbob、から読み取るとjoe、新しい値が得られます。

標準的な方法は、ICloneableインターフェイスを実装し、それを使用してディープ コピーを作成することです。つまり、Cloneメソッドで新しいオブジェクトを作成し、各データ メンバーを新しく作成したオブジェクトにコピーする必要があります。データが別の参照タイプである場合は、それも複製する必要があります。

于 2013-10-16T19:47:37.163 に答える