C#memcpy等价物

Adi*_*rda 7 c# serialization copying

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

我的用例:

我有一个模板对象(类不是struct),需要通过其中一个实例(由此模板构成的对象)进行更新

有任何想法吗?

Qua*_*noi 6

C#(并且C++也在),"新对象"和"现有对象的副本"之间没有区别,只要它们的所有成员彼此相等即可.

鉴于:

Int32 a = 5;
Run Code Online (Sandbox Code Playgroud)

,两个操作:

Int32 b = 5;
Int32 b = a;
Run Code Online (Sandbox Code Playgroud)

产生相同的结果.

MSDN参考中所述:

MemberwiseClone方法通过创建新对象,然后将当前对象的非静态字段复制到新对象来创建浅表副本.

如果字段是值类型,则执行字段的逐位复制.

如果字段是引用类型,则复制引用但不引用引用的对象; 因此,原始对象及其克隆引用相同的对象.

,也就是说,它不只是同memcpy()C++


pet*_*hen 4

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

建议:实施模板经纪人。

class TemplateProvider
{
   public MyData Template { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

为了简化组件中的语法,您可以添加一个(私有/内部?)属性

MyData Template { get { return m_templateProvider.Template; } }
void UpdateTemplate() { m_templateProvider.Template = 
                            (MyData) this.MemberwiseClone(); }
Run Code Online (Sandbox Code Playgroud)

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


简而言之,除非你自己做,否则没办法。但是,如果您无论如何都覆盖所有属性,为什么不创建一个新对象呢?

memcopy类似的低水平结构也不受支持,因为它们破坏了环境做出的保证。

结构体的浅拷贝是通过赋值创建的。对于类,MemberwiseClone是执行此操作的方法 - 但正如您所说,创建一个新对象。

没有内置的方法可以做到这一点,并且由于它可能会破坏封装,所以无论如何都应该小心使用。

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

剩下的就是通过自定义接口来支持它。您可以提供一个通用的“浅复制”例程来检查接口并使用它,并在不存在时回退到反射。这使得功能普遍可用,并且您可以在以后优化性能重要的类。