Эквивалентный C# memcpy

Благодаря @ user10930282 он был прав. Исправление для этого состояло в том, чтобы удалить ItemContainerTransitions по умолчанию для ListView:

<ListView x:Name="MyList">
    .
    .
    .
    <ListView.ItemContainerTransitions>
        <TransitionCollection>
            <!-- Empty collection to not have any transitions interrupt the composition Item animations -->
        </TransitionCollection>
    </ListView.ItemContainerTransitions>
    .
    .
    .
</ListView>
7
задан johnnyRose 10 October 2017 в 20:27
поделиться

8 ответов

[редактирование] относительно Вашего разъяснения: Как я понимаю, у Вас есть объекты N, у каждого есть (прямая) ссылка на объект шаблона. Вы хотите записать обратно к шаблону, таким образом, все объекты "видят" эти изменения.

Предложение: реализуйте шаблонного брокера.

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

Вместо того, чтобы передать шаблон, передайте шаблонного поставщика объектам.

для упрощения синтаксиса в компонентах можно ли добавить (частный/внутренний?) свойство

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

Шаблонный поставщик также упрощает привязывающиеся многопоточные сценарии.


Короче говоря, никакой путь, если Вы не делаете это сами. Но почему бы не создать новый объект, если Вы переопределяете все свойства так или иначе?

memcopy и подобные низкоуровневые конструкции не поддерживаются, так как они подрывают гарантии, сделанные средой.

Мелкая копия для структур сделана присвоением. Для классов, MemberwiseClone метод должен сделать это - но поскольку Вы говорите, что это создает новый объект.

Существует не создан способом к этому, и поскольку он потенциально повреждает инкапсуляцию, он должен использоваться с осторожностью так или иначе.

Вы могли создать универсальную стандартную программу с помощью отражения, но работает ли оно или не зависит от самого класса. И да, ti будет медленным comparedly.

То, что оставляют, поддерживает его пользовательским интерфейсом. Можно предоставить универсальную "Мелкую Копию" стандартная программа, которая проверяет на интерфейс и использование, что, и отступает к отражению, когда это не делает. Это делает функциональность доступной обычно, и можно оптимизировать классы, для которых производительность имеет значение позже.

4
ответ дан 6 December 2019 в 15:32
поделиться

В C# (и в C++ также), нет никакого различия между "новым объектом" и "копией существующего объекта" пока все их участники, равные друг другу.

Данный:

Int32 a = 5;

, обе операции:

Int32 b = 5;
Int32 b = a;

приведите к тому же результату.

Как указано в ссылке MSDN:

Метод MemberwiseClone создает мелкую копию путем создания нового объекта и затем копирования нестатических полей текущего объекта к новому объекту.

Если поле является типом значения, поразрядная копия поля выполняется.

Если поле является ссылочным типом, ссылка копируется, но отнесенный объект не; поэтому, исходный объект и его клон относятся к тому же объекту.

, т.е. это делает все равно как memcpy() в C++

6
ответ дан 6 December 2019 в 15:32
поделиться

Я предполагаю, что Вы могли просто сделать что-то как:

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

Это создаст новый объект в методе MemberwiseClone делание ссылки на объект B это. Я предполагаю, что это служит Вашим целям.

1
ответ дан 6 December 2019 в 15:32
поделиться

Присвоение одной структуры другому, во всех отношениях, работает точно как memcpy в C++ на объектах POD.

Если Вы чувствуете, что это не применяется в Вашей ситуации затем, я могу уверить Вас, что Ваш код C++ не был приспосабливанием стандарта (т.е. содержал ошибки в форме неопределенного поведения). Укажите (в вопросе), какого эффекта Вы хотите достигнуть. Это будет более полезно, чем разговор о тиражировании неопределенного поведения на другом языке.

1
ответ дан 6 December 2019 в 15:32
поделиться
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

        }
    }
}
1
ответ дан 6 December 2019 в 15:32
поделиться
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
        }
    }
}
1
ответ дан 6 December 2019 в 15:32
поделиться

Я не могу использовать недавно созданный объект, потому что мне нравится, когда объект шаблона изменяется согласно состоянию одного из его экземпляров (т.е. экземпляра, сделанного из того шаблона)

0
ответ дан 6 December 2019 в 15:32
поделиться

Когда я думаю об этом - очень интересно посмотреть на код MemberWiseClone () реализация метода и видеть, как Microsoft решила мой вопрос.

0
ответ дан 6 December 2019 в 15:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: