7

同じタイプのオブジェクトが 2 つあり、ある状態を別の状態に浅いコピーしたいと考えています。C++ には素晴らしい memcpy があります。どうすればC#でできますか? MemberwiseClone() は、新しいオブジェクトを作成して返し、既存のオブジェクトにコピーするのが好きなので、十分ではありません。リフレクションを使用することを考えましたが、製品コードには遅すぎるのではないかと心配しています。.Netシリアライザーの1つを使用することも考えましたが、既存のものを設定するのではなく、オブジェクトも作成すると思います。

私のユースケース:

インスタンスの 1 つ (このテンプレートで作成されたオブジェクト) によって更新する必要があるテンプレート オブジェクト (構造体ではなくクラス) があります。

何か案は?

4

9 に答える 9

2
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
        }
    }
}
于 2009-02-04T14:33:25.650 に答える
1
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

        }
    }
}
于 2009-02-04T14:41:30.673 に答える
1

ある構造体を別の構造体に割り当てることは、すべての目的と目的で、PODオブジェクトのC++とまったく同じように機能します。memcpy

これがあなたの状況に当てはまらないと思われる場合は、C ++コードが標準に準拠していない(つまり、未定義の動作の形でバグが含まれている)ことを保証できます。達成したい効果を(質問で)指定してください。これは、未定義の動作を別の言語で複製することについて話すよりも便利です。

于 2009-02-04T13:51:24.427 に答える
0

インスタンスの1つ(つまり、そのテンプレートで作成されたインスタンス)の状態に応じてテンプレートオブジェクトを変更するのが好きなため、新しく作成されたオブジェクトを使用できません

于 2009-02-04T13:46:00.410 に答える
0

私がそれについて考えるとき-MemberWiseClone()メソッド実装のコードを見て、Microsoftが私の質問をどのように解決したかを見るのは非常に興味深いです。

于 2009-02-04T13:48:28.143 に答える