我必须克隆一些实体,然后我写了这段代码。
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);
}
任何人都可以解释为什么第二种方式更好?
答案 0 :(得分:1)
Clone()含糊不清,甚至微软也建议不要实现ICloneable
我认为更清洁只是一个接受对象的人 克隆那个ctor
FMSUser copyUser = new FMSUser(existingUser);
然后还有一个方法
public FMSUser DeepClone()
{
return new FMSUser(this);
}
答案 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);
}
}