克隆对象的好方法

时间:2014-05-14 15:21:29

标签: 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.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);
}

任何人都可以解释为什么第二种方式更好?

2 个答案:

答案 0 :(得分:1)

Clone()含糊不清,甚至微软也建议不要实现ICloneable

我认为更清洁只是一个接受对象的人 克隆那个ctor

 FMSUser copyUser = new FMSUser(existingUser);

然后还有一个方法

 public FMSUser DeepClone() 
 {
    return new FMSUser(this);
 }

ICloneable Interface

Object.MemberwiseClone Method

答案 1 :(得分:-2)

如果您的对象是可序列化的。

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);
 }
}