質問
私は、同じタイプの2つのオブジェクトを持っていると私は他に浅いコピーに一つの状態をしたいと思います。 C ++では、私は素晴らしいですmemcpyをを持っています。どのように私はそれは、C#で行うことができますか?それが作成&新しいオブジェクトを返し、私は既存のオブジェクトにコピーしたいのでMemberwiseClone()は十分ではありません。私は、リフレクションを使用するのではと思ったが、私は、それは製品コードには遅すぎるだろう怖いです。私はまた、ネットシリアライザのいずれかを使用するのではと思ったが、私は、彼らはまた、既存のものを設定するのではなく、オブジェクトを作成すると考えています。
のマイ使用事例:の
私は(このテンプレートで作られたオブジェクト)のインスタンスのいずれかで更新する必要があるテンプレートオブジェクトを(クラスが構造ではない)しています。
任意のアイデア?
解決
[編集]あなたの明確化について: 私は理解しているように、あなたはN個のオブジェクトを持って、それぞれがテンプレートオブジェクトに(直接)を参照しています。あなたは戻って、テンプレートに書きたいので、すべてのオブジェクトは、これらの変更「を参照してください」。
提案:テンプレートブローカーをimlement
。class TemplateProvider
{
public MyData Template { get; set; }
}
代わりに、テンプレートを渡す、オブジェクトのテンプレートプロバイダを渡します。
要素の構文をsimplyfyするには、(内部/プライベート?)プロパティを追加することができます。
MyData Template { get { return m_templateProvider.Template; } }
void UpdateTemplate() { m_templateProvider.Template =
(MyData) this.MemberwiseClone(); }
テンプレート・プロバイダは、マルチスレッドのシナリオでロック簡素化
<時間>要するに、あなたはそれを自分で行う場合を除き方法はありません。あなたはとにかくすべてのプロパティをオーバーライドする場合しかし、なぜ新しいオブジェクトを作成しませんか?
彼らは環境によって作られた保証を弱体化させるため、 memcopy
と同様の低レベルの構成がサポートされていません。
構造体のための浅いコピーが割り当てによって行われます。クラスの場合、MemberwiseClone
はそれを行うための方法である - しかし、あなたが言うように、それは新しいオブジェクトを作成します。
そこにはそのための方法で構築されていない、それが潜在的にカプセル化を壊すとして、それはとにかく注意して使用する必要があります。
あなたは、リフレクションを使って汎用ルーチンを構築し、それが動作するかどうかは、クラス自体に依存性があります。そして、はい、TIはcomparedly遅くなります。
どのような残っていることは、カスタム・インタフェースによって、それを支援しています。あなたは、インターフェイスをチェックしていることを使用し、そうでないとき反射にフォールバック一般的な「シャローコピー」ルーチンを提供することができます。これは、一般的な機能が利用できるように、あなたはパフォーマンスが後で問題にどのためのクラスを最適化することができます。
他のヒント
C#
において(及びC++
においても)、「新しいオブジェクト」と「既存のオブジェクトのコピー」との間の差は限り互いに等しいすべてのメンバとして存在しない。
が与えられます:
Int32 a = 5;
、両方の操作
Int32 b = 5;
Int32 b = a;
同じ結果を得た。
MSDN参照するに述べたように
MemberwiseCloneメソッドは、新しいオブジェクトを作成し、新しいオブジェクトを現在のオブジェクトの非静的フィールドをコピーすることによって、浅いコピーを作成します。
フィールドは、フィールドのビットごとのコピーが実行され、値型である場合。
フィールドが参照型である場合、参照がコピーされているが、参照されるオブジェクトではありません。従って、元のオブジェクトとそのクローンが同じオブジェクトを参照します。
、すなわちそれしmemcpy()
でC++
ようちょうど同じ
私はあなただけのような何かを行うことができると思います:
YourObjectType A = new YourObjectType();
YourObjectType B = a.MemberwiseClone();
これはMemberwiseCloneメソッド内に新しいオブジェクトを作成AN Bオブジェクトはそれを参照するであろう。私はそれがあなたの目的に役立つと思います。
割り当ては、の正確のPODオブジェクトにC ++でmemcpy
のように動作します。
あなたはこれがあなたの状況には適用されないと感じた場合、私はあなたのC ++コードは(すなわち、未定義の動作の形でバグを含ん)標準準拠ではなかったことを保証することができます。あなたが達成したいどのような影響(の質問に)を指定してください。これは、別の言語で未定義の動作を複製について話よりも有用であろう。
namespace WindowsFormsApplication7
{
[Serializable] // just put this in your class
class Mate
{
public string SomeProperty { get; set; }
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
var mA = new Mate();
mA.SomeProperty = "Hey";
var vf = new BinaryFormatter();
var ns = new MemoryStream();
vf.Serialize(ns, mA);
byte[] vytes = ns.ToArray();
var vfx = new BinaryFormatter();
var nsx = new MemoryStream();
nsx.Write(vytes, 0, vytes.Length);
nsx.Seek(0, 0);
var mB = (Mate)vfx.Deserialize(nsx);
mA.SomeProperty = "Yo";
MessageBox.Show(mA.SomeProperty); // Yo
MessageBox.Show(mB.SomeProperty); // Hey
}
}
}
namespace WindowsFormsApplication7
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
var dt = new DataTable();
dt.Columns.Add("lastname", typeof(string));
dt.Columns.Add("firstname", typeof(string));
dt.Rows.Add("lennon", "john");
dt.Rows.Add("mccartney", "paul");
var ms = new MemoryStream();
var bf = new BinaryFormatter();
bf.Serialize(ms, dt);
byte[] bytes = ms.ToArray();
var bfx = new BinaryFormatter();
var msx = new MemoryStream();
msx.Write(bytes, 0, bytes.Length);
msx.Seek(0, 0);
// doesn't just copy reference, copy all contents
var dtx = (DataTable)bfx.Deserialize(msx);
dtx.Rows[0]["lastname"] = "Ono";
// just copy reference
var dty = dt;
dty.Rows[0]["lastname"] = "Winston";
MessageBox.Show(dt.Rows[0]["lastname"].ToString()); // Winston
MessageBox.Show(dtx.Rows[0]["lastname"].ToString()); // Ono
MessageBox.Show(dty.Rows[0]["lastname"].ToString()); // Winston
}
}
}
私は新しく作成されたオブジェクトを使用することができないのテンプレートの目的は、(そのテンプレートから作らすなわちインスタンス)そのインスタンスのいずれかの状態に応じて変更する
私はそれについて考えるとき - それはMemberWiseClone()メソッドの実装のコードを見て、マイクロソフトは私の質問を解決方法を確認することは非常に興味深いです。
。