2014-05-14 3 views
2

일부 엔티티를 복제해야하고이 코드를 작성했습니다. 객체를 복제하는 좋은 방법

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

이 두 번째 방법이 더 나은 이유를 설명해 anynone 수 ?

+3

당신은 일반적으로'Clone'을 피해야한다. 대신에'DeepClone' 메쏘드 (또는 원하는 이름)를 제공하십시오. deep 또는 shallow 복사본을 사용하여'Clone'이 어떻게 구현되는지 알지 못합니다. –

+1

코드가 매개 변수 기반의 컨스트럭터에서 사용될 수 있도록 그냥 감쌌다. 그러나 두 번째 방법은 기본 클래스에 아무 것도하지 않으므로 기본 클래스는 복제 된 값 대신 기본값을 갖게됩니다. – Tarec

+1

클론이 이것을 수행하는 가장 좋은 방법이라고 생각하지 않습니다. 대신 리플렉션을 사용하고 속성을 동적으로 복제 할 수 있습니다. 속성이 동일하고 (동일한 유형, 이름 등) 한 객체에서 다른 객체로 액세스 할 수있는 한 클래스의 변경 사항에 대해 걱정할 필요가 없습니다. – stripthesoul

답변

-2

개체가 serializable 인 경우.

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

이 메서드를 사용합니다. ^^ – Xaruth

+1

객체를 추가해야합니다. 직렬화 가능하고 다른 동체로 표시되어야합니다. – Paparazzi

1

클론() 모호하며, 심지어 마이크로 소프트는

내가 생각하는 청소기는 다음

FMSUser copyUser = new FMSUser(existingUser); 

의 ctor 점에서 객체
복제 소요 단지의 ctor입니다 ICloneable

구현하지 않는 것이 좋습니다 또한 방법이있다

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

ICloneable Interface

Object.MemberwiseClone Method

+0

의견을 나누기 위해 투표를 하시겠습니까? – Paparazzi

+0

지금 귀하의 메시지를 보았습니다. 미안해. 내가 너를 뽑아 준 줄 알았다. 사과. –

관련 문제