C# 克隆对象的好方法
我必须克隆一些实体,然后我写了这段代码C# 克隆对象的好方法,c#,.net,clone,C#,.net,Clone,我必须克隆一些实体,然后我写了这段代码 public override object Clone() { var CloneUser = base.Clone() as FMSUser; CloneUser.Username = this.Username; CloneUser.IsEnabled = this.IsEnabled; CloneUser.IsNeedPasswordReset = this.IsNeedPasswordReset; CloneUser.Las
public override object Clone()
{
var CloneUser = base.Clone() as FMSUser;
CloneUser.Username = this.Username;
CloneUser.IsEnabled = this.IsEnabled;
CloneUser.IsNeedPasswordReset = this.IsNeedPasswordReset;
CloneUser.LastName = this.LastName;
CloneUser.FirstName = this.FirstName;
CloneUser.MiddleName = this.MiddleName;
CloneUser.DistributorID = this.DistributorID;
CloneUser.IsLocked = this.IsLocked;
return CloneUser;
}
但后来我的同事给我发了这个代码,说这样克隆比较好,但不能告诉我为什么:
public FMSUser(FMSUser user)
{
this.Username = user.Username;
this.IsEnabled = user.IsEnabled;
this.IsNeedPasswordReset = user.IsNeedPasswordReset;
this.LastName = user.LastName;
this.FirstName = user.FirstName;
this.MiddleName = user.MiddleName;
this.DistributorID = user.DistributorID;
this.IsLocked = user.IsLocked;
}
public override object Clone()
{
return new FMSUser(this);
}
没有人能解释为什么第二种方法更好吗?如果对象是可序列化的
public static T Clone<T>(T obj)
{
using (var ms = new MemoryStream())
{
var formatter = new BinaryFormatter();
formatter.Serialize(ms, obj);
ms.Position = 0;
return (T) formatter.Deserialize(ms);
}
}
公共静态T克隆(T obj)
{
使用(var ms=new MemoryStream())
{
var formatter=新的二进制格式化程序();
序列化(ms,obj);
ms.Position=0;
返回(T)格式化程序。反序列化(ms);
}
}
如果对象可序列化
public static T Clone<T>(T obj)
{
using (var ms = new MemoryStream())
{
var formatter = new BinaryFormatter();
formatter.Serialize(ms, obj);
ms.Position = 0;
return (T) formatter.Deserialize(ms);
}
}
公共静态T克隆(T obj)
{
使用(var ms=new MemoryStream())
{
var formatter=新的二进制格式化程序();
序列化(ms,obj);
ms.Position=0;
返回(T)格式化程序。反序列化(ms);
}
}
Clone()模棱两可,甚至微软也建议不要实现ICloneable
我认为更干净的只是一个接受对象的向量在那个地方克隆
FMSUser copyUser = new FMSUser(existingUser);
那也有办法
public FMSUser DeepClone()
{
return new FMSUser(this);
}
克隆()模棱两可,甚至微软也建议不实施ICloneable
我认为更干净的只是一个接受对象的向量在那个地方克隆
FMSUser copyUser = new FMSUser(existingUser);
那也有办法
public FMSUser DeepClone()
{
return new FMSUser(this);
}
一般来说,你应该避免克隆。而是提供一个
DeepClone
方法(或任何您想要的名称)。您不知道如何使用深度或浅层复制来实现克隆
。这不是更好的方法,它只是包装好,以便可以从基于参数的构造函数中使用代码。但是请记住,第二种方法对基类没有任何作用,所以看起来基类将有默认值而不是克隆值。我认为克隆不是最好的方法。您可以使用反射,动态克隆属性,这样您就不必担心类中的更改,只要属性相同(相同的类型、名称等),并且可以从一个对象访问到另一个对象。这听起来像是CodeReview的一个问题?如果他不能告诉您为什么更好,那就不是更好,这只是一种意见。第一个方法处理基类,第二个方法忽略基类属性。如果没有整个实现,我们无法判断它是否会产生影响。一般来说,您应该避免克隆。而是提供一个DeepClone
方法(或任何您想要的名称)。您不知道如何使用深度或浅层复制来实现克隆
。这不是更好的方法,它只是包装好,以便可以从基于参数的构造函数中使用代码。但是请记住,第二种方法对基类没有任何作用,所以看起来基类将有默认值而不是克隆值。我认为克隆不是最好的方法。您可以使用反射,动态克隆属性,这样您就不必担心类中的更改,只要属性相同(相同的类型、名称等),并且可以从一个对象访问到另一个对象。这听起来像是CodeReview的一个问题?如果他不能告诉您为什么更好,那就不是更好,这只是一种意见。第一个方法处理基类,第二个方法忽略基类属性。如果没有完整的实现,我们无法判断它是否有影响。您应该添加对象必须标记为可序列化,其他声明您应该添加对象必须标记为可序列化,其他声明是否需要注释?我现在看到了您的消息。对不起,我以为我放弃了你的投票权。抱歉,你有什么评论吗?我现在看到你的留言了。对不起,我以为我放弃了你的投票权。道歉。