2016-03-20 6 views
3

だから私は私のC#の本を読んでいると、それはオブジェクトのディープコピーを作成するためのメソッドを作成する方法の例があります。System.ObjectにCloneメソッドを入れなかったのはなぜですか?

[Serializable] 
public class DeepClone : IDeepCopy<DeepClone> 
{ 
    public int data = 1; 
    public List<string> ListData = new List<string>(); 
    public object objData = new Object(); 
    public DeepClone DeepCopy() 
    { 
     BinaryFormatter BF = new BinaryFormatter(); 
     MemoryStream memSfream = new MemoryStream(); 
     BF.Serialize(memStream,this); 
     memStream.Flush(); 
     memStream.Position = 0; 
     return (DeepClone)BF.Deserialize(memStream); 
    } 
} 

をしかし、この方法DeepCopyは、それが依存していないことを十分に一般的ですオブジェクトの他のメンバ上にある。

public int data = 1; 
    public List<string> ListData = new List<string>(); 
    public object objData = new Object(); 

オブジェクト。私が知る限り、この方法はいずれもclassに入れることができ、まったく同じように動作します。さらに、オブジェクトをコピーする方法は、多くのC#プログラマーが、初めて言語を使用するときに、this threadの人気が証明するような質問です。

これはなぜSystem.Objectにクローン機能が指定されていないのかという質問が表示されます。結局のところ、プログラマはGetHashcodeメソッドよりも多くの場合、Cloneメソッドが必要になると思います。

+0

"プログラマーは、GetHashcodeメソッドよりもCloneメソッドが必要になることが多いと思います。"私は 'GetHashCode'を使ったよりも' Clone'を使ったことはないと思うし、 'GetHashCode'に'Object'に入っています。すべてがクローン化に適しているわけではなく、すべてがハッシュテーブルのキーとして使用するのに適しているわけではありません。 –

+0

.NETのデザイナーは、C++からそのレッスンをうまく学びました。プログラマーが正しくクローンを実装していないため、誤った動作をするプログラムを頻繁に作成する言語。それについてはなんのこともありません。ICloneableは、間抜けになるにつれて狭くエスケープされました。ガベージコレクションのおかげで、.NETでは必要性はあまりありません。 –

答えて

3

すべてのクラスがクローニングをサポートするわけではありません。その定義によるシングルトンオブジェクトは複製できません。 OOは、そのようなクラスにはCloneメソッドが含まれてはならないと規定しています。クラスはSystem.Objectの継承を避けることができないため、そのレベルでメソッドを導入すべきではありません。 (同じ理由で方法ToString()Equals()GetHashCode()に適用すべきであるが、私は誰かがそうでなければ決定推測。)

をインタフェースの特徴に加えて、クローニングは、例えば、それはそうほど自明ではありません子オブジェクトが親に​​参照を格納するときたとえば、(WinFormsや他の)コントロールをクローンすると、親コントロールではなく、子コントロールもクローンされたほうがよいでしょう。クローンを作成する必要があり、複製しないクローンが必要ですか?これにより、すべてのケースで正しくクローンを実装することが(不可能ではないにしても)難しくなります。

+0

すべてのオブジェクトにクローンメソッドを与え、特定のオブジェクトでそれを使用するのが理にかなっているかどうかを判断するために、開発者に任せてみてはどうでしょうか? – user6048670

+1

ヒラリー:私の編集された回答がこれに対処しています。あなたは派生レベルで意味をなさないメソッドで太ったインターフェースを望んでいません。派生クラスにはオプションはありませんが、スローするとインターフェイスが無意味になります。 –

関連する問題