c#中的对象克隆

Mai*_*ein 3 c# clone object

请考虑以下相关问题:深度克隆对象

这真的是克隆对象的最佳方法吗?化(serialize /反序列化).序列化对我来说似乎有点贵.

我的想法是创建第二个构造函数并只分配所有变量.这种方法会更快吗?

class Test
{

public Test(Test clone)
{
// clone ....
}
}
Run Code Online (Sandbox Code Playgroud)

Har*_*rry 6

这取决于你想要克隆什么以及为什么.如果浅克隆是好的,那么:

private static T CloneShallow<T>(T i) {
    return
        (T)i.GetType()
            .GetMethod(
                "MemberwiseClone",
                BindingFlags.Instance | BindingFlags.NonPublic
            ).Invoke(i, null);
}
Run Code Online (Sandbox Code Playgroud)

这是克隆任何类型的简单记录的最快方法.

如果您需要完整副本,但这不是时间关键,那么:

private static T CloneFull<T>(T i) {
    if (Object.ReferenceEquals(i, null)) return default(T);
    var x = new XmlSerializer(i.GetType());
    using (var m = new MemoryStream()) {
        x.Serialize(m, i);
        m.Seek(0, SeekOrigin.Begin);
        return (T)x.Deserialize(m);
    }
}
Run Code Online (Sandbox Code Playgroud)

第二个比第一个慢约70倍.

如果您需要完整拷贝并且速度很重要,请考虑使用protobuf-net作为序列化器.

有很多答案涉及修改你想克隆的对象,但通常你只需要克隆一个简单的记录而你不想在它上面实现任何东西.

如果你想知道CloneFull()有多慢 - 在我的电脑上(i5 661 @ 3.33GHz)有非常简单的记录,它需要360个刻度,这给了36ns.在大多数情况下哪个足够快:)