2011-11-08 10 views
0

私はなぜこれが仮想ではないのSystem.ObjectなぜMemberwiseClone()は仮想ではありませんか? System.Object?

[SecuritySafeCritical] 
    protected object MemberwiseClone(); 

でこれを見つけましたか?私がmyclassをオブジェクトに入れ、MemberwiseCloneを呼び出すと、これは壊れませんか?その場合、MemberwiseCloneの実装についてはわかりませんが、それはobject.MemberwiseClone()と呼ばれませんでしたか? (私はそれが反射で不正行為することができると思うが、バーチャルは必要なものを正確に行うだろう)。私はなぜこれが仮想ではないのか分からないのですか?また、Equals、ToStringなどは(public)virtualであることに注意してください。

答えて

2

MemberwiseCloneはCLRによって直接実装されているため、オブジェクトの型が正確にわかり、メンバーワイズクローンを作成する方法がわかります。これを行うには唯一の方法しかないので、Equals、ToStringなどの特殊なロジックを使って振る舞いを "カスタマイズ"できるようにする理由はありません。それについて考えるもう1つの方法:それを上書きできる場合、 APIの契約を破ることのない基本実装よりも優れていますか?

+0

私はまだ少し混乱しています。 'void myfunc(Object o){o.MemberwiseClone();がある場合。 } 'その後、somoneは自分のDLLを取得し、独自のクラスを作成し、それを渡します。どのようにCLRはMemberwiseCloneのアドレスを知っていますか?仮想としてマークされていない場合でも、その機能のvtableスロットを追加しますか?スロットがなく、反射を使用しています。それはまだ面白いようです。良い答えですが、実装の考えは奇妙なようです –

+0

@ acidzombie24いいえ、ただ1つのMemberwiseCloneがあります。 CLRは、メモリ内の各オブジェクトの種類を知っています。つまり、System.Object.GetType()がどのように動作するかです。内部的には、各.NETオブジェクトに、オブジェクトがどのタイプであるかを知るために使用できる「メソッドテーブル」へのポインタがあります。 –

+0

"メソッドテーブル"へのポインタを使用すると、反射のように聞こえる。それは論理的に聞こえるよ。しかし、なぜ私はなぜMemberwiseCloneが保護されていて、公開されていないのだろうか。その質問に自由にお答えください。 SO –

0

あなたが本当に求めているのは、独自のカスタムクローンメソッドを作成する方法です。これを行う従来の方法は、ICloneableインターフェイスを実装し、そのCloneメソッドをオーバーライドすることです。その後、あなたは好きなだけバーチャルにすることができます。

+0

それは間違いなく私が求めているものではありません –

関連する問題