我有 2 个相同类型的对象,我想将一种状态浅复制到另一种状态。在 C++ 中,我有 memcpy,这很棒。我怎样才能在 C# 中做到这一点? MemberwiseClone()不够好,因为它创建并返回一个新对象,并且我想复制到现有对象。我想过使用反射,但恐怕它对于生产代码来说太慢了。我也想过使用 .Net 序列化程序之一,但我认为它们也创建对象而不是设置现有的对象。

我的用例:

我有一个模板对象(类不是结构),它需要由它的一个实例(由这个模板组成的对象)更新

有任何想法吗?

最佳答案

[编辑] 关于您的澄清:
据我了解,您有 N 个对象,每个对象都有一个对模板对象的(直接)引用。您想写回模板,以便所有对象“看到”这些更改。

建议:实现模板代理。

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

不是传递模板,而是将模板提供程序传递给对象。

为了简化组件中的语法,您可以添加一个(私有(private)/内部?)属性
MyData Template { get { return m_templateProvider.Template; } }
void UpdateTemplate() { m_templateProvider.Template =
                            (MyData) this.MemberwiseClone(); }

模板提供程序还简化了多线程场景中的锁定。

总之,除非你自己做,否则没有办法。但是,如果您无论如何都要覆盖所有属性,为什么不创建一个新对象呢?
memcopy 和类似的低级构造不受支持,因为它们破坏了环境的保证。

结构的浅拷贝是通过赋值进行的。对于类, MemberwiseClone 是这样做的方法 - 但正如您所说,它会创建一个新对象。

没有内置的方法,因为它可能会破坏封装,所以无论如何都应该小心使用。

您可以使用反射构建一个通用例程,但它是否有效取决于类本身。是的,ti 会比较慢。

剩下的就是通过自定义界面来支持它。您可以提供一个通用的“浅拷贝”例程来检查接口(interface)并使用它,并在没有时回退到反射。这使得功能普遍可用,并且您可以优化稍后对性能很重要的类。

10-06 13:31