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的一个问题?如果他不能告诉您为什么更好,那就不是更好,这只是一种意见。第一个方法处理基类,第二个方法忽略基类属性。如果没有完整的实现,我们无法判断它是否有影响。您应该添加对象必须标记为可序列化,其他声明您应该添加对象必须标记为可序列化,其他声明是否需要注释?我现在看到了您的消息。对不起,我以为我放弃了你的投票权。抱歉,你有什么评论吗?我现在看到你的留言了。对不起,我以为我放弃了你的投票权。道歉。