我有 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)并使用它,并在没有时回退到反射。这使得功能普遍可用,并且您可以优化稍后对性能很重要的类。