私はオブジェクトのコレクションを持っています。このコレクションを複製し、さまざまなアプローチのパフォーマンスの意味を理解しようとしています。DeepCloneのパフォーマンス(バイナリシリアル化を使用)とプロパティの手動設定との比較
コレクション内のオブジェクトには、約20個のプロパティすべてstring、ints、float(このオブジェクトの内部にはネストされたオブジェクトはありません)があります。 2つのアプローチがある:
DeepClone()メソッドを作成します。
public static class ExtensionMethods { public static T DeepClone<T>(this T a) { using (var stream = new MemoryStream()) { var formatter = new BinaryFormatter(); formatter.Serialize(stream, a); stream.Position = 0; return (T)formatter.Deserialize(stream); } }
}
は手動で "コピー" 私はコレクションをループしていたコードと "新しい" INGのを書きます新しいオブジェクトを作成し、20個のプロパティすべてを手動で設定します。 1は非常に速く、他のものであるべき
:私は人々のフィードバックを取得したいので、この
public MyObject Copy(MyObject myObj) { var obj = new MyObject(); obj.Prop1 = myObj.Prop1; obj.Prop2 = myObj.Prop2; return obj;
}
のようなものは、私は非常に矛盾した結果を取得していますか?私は選択肢2つと思っていただろうが、私のテストではこれをサポートしていないようだから、私が何か間違っているかどうかを判断しようとしている。
これをさらに高速に行う方法はありますか?
浅いコピーを実行したいときにこのDeepClone()というラベルを付けた理由はわかりません。文字列は不変なので、文字列の浅いコピーはディープコピーと同等です。さらに、BinaryFormatterがリフレクションを使用してプロパティ名、セッター、コンストラクタなどを取得するため、手動での設定がはるかに高速になるはずです – Gleno
@Gelno - このメソッドは深くなりますオブジェクトがネストされたオブジェクト(したがって名前)を持つ場合、オブジェクトをクローンします。 – leora