0
MemberwiseClone(Object fromObject, Object toObject)

人生で何度か使ってみたくなる機能です。ガベージを作成しないため、MemberwiseClone の現在の実装よりも大きな利点があります。

たとえば、1000 個のオブジェクトの配列があり、元のオブジェクトを破損することなく、SomeFunction() の呼び出しがオブジェクトに与える影響を反復してテストしたいとします。科学シミュレーションの世界ではよくあることです。

MemberwiseClone の既存の実装を使用すると、1000 個のオブジェクトに相当するガベージが作成されます。私が提案した方法が存在する場合、1 つのオブジェクトを作成し、それをすべての反復で再利用できます。これにより明らかにガベージがはるかに少なくなり、GC の作業もはるかに少なくなります。メソッドの実装がオリジナルとそれほど異なるとは想像できないので、フレームワークに追加するのにほとんど時間がかからなかったと思います。

フィールドごとにコピーするオブジェクトの GetCopy() メソッドを維持することは完全に可能ですが、これには 2 つの問題があります。何よりもまず、それを維持する必要があります。新しいフィールドが追加されるたびに、それを GetCopy に追加するのを忘れると、プログラムが壊れます。第 2 に、大きなオブジェクトの場合、クローンのメモリ ブロックをコピーするよりもはるかに効率が悪くなります。

すべてのフィールドを格納するためにオブジェクト内に構造体を埋め込む必要がありましたが、それらを GetCopy メソッドに追加することを覚えておく必要はなく、単一の割り当てでそれらすべてをコピーできます。これの問題は、コードが非常に醜くなることです。

では、このメソッドが実装されなかった正当な理由はありますか? それとも、私が想像しているほど役に立たないだけですか。

4

2 に答える 2

3

では、このメソッドが実装されなかった理由はありますか? それとも、私が想像しているほど役に立たないのですか?

あなたのクラスだけが、MemberwiseClone が有効なメソッドであるかどうかを知ることが保証されています。プライベート フィールドによって参照される値は、1 つのインスタンスに固有である必要がありますか? 一部のフィールドはインスタンスの有効期間に関連していますか? コンストラクターで設定する必要がある読み取り専用フィールドはありますか? MemberwiseClone をクラス実装内でのみ呼び出す必要があることは理にかなっています。

たとえば、1000 個のオブジェクトの配列があり、元のオブジェクトを破損することなく、SomeFunction() の呼び出しがオブジェクトに与える影響を反復してテストしたいとします。科学の世界ではかなり一般的な出来事です。

  • テストを作成している場合、テストはすでに自己完結型になっているはずです。

  • 何らかの変換に基づいて新しい配列が必要な場合、変換関数は、元のオブジェクトを変更するのではなく、新しいオブジェクトを返すものでなければなりません。

編集

インスタンス化のオーバーヘッドを回避するために、別のクローン インスタンスを作成する代わりに、フィールドを既存のオブジェクトにコピーしたいということは理解しています (ただし、インスタンス化が実際に大きなオーバーヘッドになるかどうかはわかりません)。

問題は、他のオブジェクトが最初のクローンを参照している可能性があり、元に戻したときにそれが「新しい」クローンであることを知る方法がないことです。真のクローンは新しいオブジェクトであるため、このようなメソッドを「クローン」と呼ぶのは意味がありません。

元に戻す機能については、MemberwiseClone と同じ理由で、クラスの内部にある方が理にかなっています。任意のクローンを取り、すべてのフィールドを別の任意のオブジェクトに適用する汎用関数は、仮定が多すぎます。オブジェクト自体は、初期化時に自分自身を複製し、適切なフィールドを元に戻す必要があります。

于 2013-08-09T14:40:41.117 に答える
0

その機能は便利だろうけど、「便利なのになぜ x が存在しないの?」という疑問への答え。ほとんどの場合:

[..] 誰かが機能を設計、実装、テスト、文書化、出荷するまで、すべての機能は実装されません [..] - Eric Lippert

コメントでこれを引用してくれたユーザー「デフォルト」に感謝します。つまり、機能にはお金がかかるため、すべてを手に入れることはできません。

いずれにせよ、この機能が存在できない、または設計上ひどく壊れている根本的な理由はありません。それはうまくいくでしょう。

于 2013-08-09T14:08:02.320 に答える