目次:
定義-Deep Copyとはどういう意味ですか?
C#のディープコピーとは、オブジェクトのコピーを作成して、インスタンスメンバーと参照メンバーが指すオブジェクトの両方のコピーが含まれるようにする手法のことです。
ディープコピーは、(値型の)直接参照される要素と、参照を保持する参照型の間接的に参照される要素(ポインタ)を含むオブジェクトのすべての要素を、データを含むのではなくデータを含む場所にコピーすることを目的としていますデータ自体。 ディープコピーは、元のデータを参照せずに新しいコピー(クローン)が作成されるシナリオで使用されます。
TechopediaはDeep Copyについて説明します
ディープコピーは、オブジェクトの参照型メンバーがコピーされる方法が浅いコピーと異なります。 どちらの場合も値型のフィールドメンバーをコピーするときに、フィールドのビットごとのコピーが実行されます。 参照タイプのフィールドをコピーする場合、シャローコピーでは参照のみがコピーされますが、ディープコピーでは、参照されるオブジェクトの新しいコピーが実行されます。
ディープコピーは、ValueInfoの他のメンバーとともに参照タイプのメンバーとしてAddressInfoを持つEmployeeオブジェクトを検討することにより、例で説明できます。 Employeeのディープコピーは、Employeeと等しい値型のメンバーを持つ新しいオブジェクトEmployee2を作成しますが、AddressInfoのコピーである新しいオブジェクトAddressInfo2を参照します。
ディープコピーは、次のいずれかの方法を使用して実装できます。
- クラスのコピーコンストラクターは、値と参照(適切なメモリ割り当て後)タイプの両方のメンバーをコピーするために必要なロジックで実装できます。 この方法は面倒でエラーが発生しやすいです。
- System.Object.MemberwiseCloneメソッドを使用して、値型の非静的メンバーをコピーできます。 参照タイプのオブジェクトのコピーを作成して、元のオブジェクトと同じ値のセットを割り当てることができます
- ディープコピーする必要があるオブジェクトは、復元することで新しいオブジェクトにシリアライズおよびデシリアライズできます。 このメソッドは自動化されており、オブジェクトメンバーの変更のためにコードを変更する必要はありませんが、他のメソッドよりも遅く、クローン化されたオブジェクトをシリアル化できる必要があります
- 再帰を使用したリフレクションを使用すると、浅いコピーを取得できます。この時点で、ディープコピーに必要な追加コードを追加できます。 このメソッドは自動化されており、オブジェクトのフィールドの追加または削除のためにコードを変更する必要はありません。 速度が遅く、部分信頼環境では許可されていません
- 中間言語コードを使用できます。これは高速ですが、コードの可読性が低下し、メンテナンスが困難になります
ディープコピーを実装するには:
- オブジェクトは明確に定義する必要があり、任意にすることはできません
- オブジェクトのプロパティは考慮されません
- 特別な場合(管理されていない参照を含むオブジェクトなど)のインテリジェンスを使用して、クローニングを自動化する必要があります
