C# memcpy equivalent

泪湿孤枕 提交于 2019-11-28 12:15:30

[edit] regarding your clarification: As I understand, you have N objects, each has a (direct) reference to the template object. You want to write back to the template so all objects "see" these changes.

Suggestion: imlement a template broker.

class TemplateProvider
{
   public MyData Template { get; set; }
}

Instead of passing the template, pass the template provider to the objects.

to simplyfy the syntax in the components, you can add a (private/internal?) property

MyData Template { get { return m_templateProvider.Template; } }
void UpdateTemplate() { m_templateProvider.Template = 
                            (MyData) this.MemberwiseClone(); }

The template provider also simplifies locking in multithreaded scenarios.


In short, no way unless you do it yourself. But why not create a new object if you override all properties anyway?

memcopy and similar low level constructs are not supported since they undermine guarantees made by the environment.

A shallow copy for structs is made by assignment. For classes, MemberwiseClone is the method to do that - but as you say that creates a new object.

There is no built in way for that, and as it potentially breaks encapsulation it should be used with care anyway.

You could build a generic routine using reflection, but whether it works or not depends on the class itself. And yes, ti will be comparedly slow.

What's left is supporting it by a custom interface. You can provide a generic "Shallow Copy" routine that checks for the interface and uses that, and falls back to reflection when it doesn't. This makes the functionality available generally, and you can optimize the classes for which performance matters later.

In C# (and in C++ too), there is no difference between "new object" and "a copy of existing object" as long as all their members equal to each other.

Given:

Int32 a = 5;

, both operations:

Int32 b = 5;
Int32 b = a;

yield the same result.

As stated in MSDN reference:

The MemberwiseClone method creates a shallow copy by creating a new object, and then copying the nonstatic fields of the current object to the new object.

If a field is a value type, a bit-by-bit copy of the field is performed.

If a field is a reference type, the reference is copied but the referred object is not; therefore, the original object and its clone refer to the same object.

, i.e. it does just the same as memcpy() in C++

I guess you could just do something like:

YourObjectType A = new YourObjectType();
YourObjectType B = a.MemberwiseClone();

This will create a new object inside the MemberwiseClone method an make the B object reference it. I guess it serves your purposes.

Assignment of one struct to another, for all intents and purposes, works exactly like memcpy in C++ on POD objects.

If you feel that this doesn't apply in your situation then I can assure you that your C++ code was not standard-conforming (i.e., contained bugs in the form of undefined behaviour). Please specify (in the question) what effect you want to achieve. This will be more useful than talking about replicating undefined behaviour in another language.

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

        }
    }
}

I cannot use a newly created object because i like the template object to be changed according to the state of one of its instances (i.e instance made of that template)

When i think about it - it's very interesting to look at the code of the MemberWiseClone() method implementation and see how Microsoft solved my question.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!