0

テンプレートのディクショナリからクラス インスタンスのコピーを作成するのに問題があります。MemberwiseClone()ディクショナリのテンプレート フィールドを参照するいくつかのフィールドが残っているようです。Visual Studio の DataTips が提供するように、それが便利な方法であるかどうかを確認できるようにしたいと思います。

参照型オブジェクト (またはそのフィールド) のインスタンスが同じ型の別のインスタンスを参照しているかどうかを確認する方法はありますか (メンバーごとの複製後)?

4

3 に答える 3

2

ルールは、すべての値型がコピーされ、すべての参照型が参照のみをコピーするというものです。浅いコピーです。

それが必要な動作でない場合は、独自のクローン メソッドをロールする必要があります。

おそらくディープ コピーについて話していると思いますが、その場合、知っておくべきことがわかります: .NET (特に C#) でオブジェクトのディープ コピーを行うにはどうすればよいですか?

インスタンスへの参照数のカウントに関しては、Eric Lippert は、C# は参照カウントを行わないと述べています。しかし、それはあなたがやりたいことだとは思いません。

于 2012-12-15T21:32:23.233 に答える
0

メモリ プロファイラーを使用して、参照を手動でチェックできます。.NET メモリ プロファイリング ツールを参照してください。

于 2012-12-15T21:43:43.390 に答える
0

Java の「機能」の 1 つは、非プリミティブ型が実際には 1 つしかないことです。それは、あらゆる種類の方法で使用できるオブジェクト参照です。これにより、フレームワークの実装が容易になりますが、変数の型だけではその意味を説明するには不十分です。.net は多くの点で Java を改善していますが、根本的な弱点も共有しています。

たとえば、オブジェクトに[または、Java の場合は]型Georgeのフィールドがあるとします。そのようなフィールドが表すことができる根本的に異なるものが少なくとも 5 つあります。BobIList<String>list<string>

  1. 変更を許可しない一連の文字列を保持するオブジェクトへの参照を保持します。そのリストの項目 5 が「Barney」の場合、そのリストの項目 5 は「Barney」以外になることはありません。このシナリオでは、`Bob` はリストの不変の側面のみをカプセル化します。さらに、参照は、ジョージの状態のその側面に関心のある任意のコードに自由に共有できます。
  2. それは、参照を保持する人によって変更される可能性のある一連の文字列を保持するオブジェクトへの参照を保持しますが、そのオブジェクトへの参照を持つエンティティは、リストを変更したり、リストを変更する可能性のあるものに公開したりすることを許可しません。さらに悪いことに、リストはその内容を変更することを許可しますが、実際にはそれらの内容を変更するものは何もありません。上記のように、「Bob」はリストの不変の側面のみをカプセル化しますが、「George」は、リストを変更しないと信頼できるコードにのみ参照を公開することで、そのような不変性を維持する責任があります。
  3. 自由に変更できる文字列のセットを保持するオブジェクトへの唯一の参照を、宇宙のどこにでも保持します。このシナリオでは、`Bob` はリストの *変更可能な状態* をカプセル化します。`George` をコピーする場合は、古いリストと同じ項目で新しいリストを作成し、そのコピーに参照を与える必要があります。また、`George` は、そのコードがリストを変更しようとするかどうかにかかわらず、参照を永続化する可能性のあるコードに参照を渡すことができないことに注意してください。
  4. 他のオブジェクトによって「所有」されているリストへの参照を保持します。これは、他のオブジェクトの利益のためにリストにアイテムを追加するか、他のオブジェクトが `George` のリストに入れたことを観察するために使用されます。の利益。このシナリオでは、`Bob` はリストの *ID* をカプセル化します。正しいクローンでは、`Bob` はオリジナルと *同じリスト* を識別しなければなりません。
  5. それは、それが所有し、変更されるリストへの参照を保持しますが、他のいくつかのオブジェクトも参照を保持します (おそらく、`George` の利益のためにリストに何かを追加できるようにするため、またはおそらくできるようにするため)。 `George` がリストに対して行うことを参照してください)。このシナリオでは、`Bob` は *変更可能な状態と ID の両方* をカプセル化します。両方の側面をカプセル化するフィールドが存在するということは、*他のオブジェクトの協力なしに'George'の意味的に正しいコピーを作成することは不可能*であることを意味します。

要するに、Bobリストの変更可能な状態、その ID、またはその両方をカプセル化することも、どちらもカプセル化しないことも可能です (ID 以外の不変の状態は「景品」です)。変更可能な状態のみをカプセル化する場合、意味的に正しい のコピーは、同じ内容で初期化された別のリストを参照するGeorge必要があります。BobID のみをカプセル化する場合、意味的に正しいコピーBobは同じリストを参照する必要があります。可変状態と不変状態の両方をカプセル化する場合George、分離して適切に複製することはできません。どちらも行わないフィールドは、都合に応じてコピーすることもコピーしないこともできます。

参照されるオブジェクトの変更可能な状態をカプセル化するフィールド、ID をカプセル化するフィールド、およびその両方をカプセル化するフィールドを適切に判断できれば、意味的に正しい複製操作が何をすべきかは明らかです。残念ながら、このような方法でフィールドを分類するための標準的な規則がフレームワークにないため、独自の方法を考え出し、それを使用する複製スキームを作成する必要があります。

于 2012-12-15T22:27:08.197 に答える