2013-06-12 8 views
0

.net 4.5 (C#)에서 오브젝트 (클래스가 아니라 구조체)를 복제해야합니다.
나는 두 가지 방법을 발견 :오브젝트 복사본 만들기

  1. 주먹 방법 내가 좋아하는 ICloneable Interface
  2. this famous SO answer

처럼 자신의 복제 메커니즘을 만들기 구현 - 그것은 쉽게, 그러나 나는 또한 Not Implpement ICloneable Interface을 발견하지만 아주 오래된 포스트와 MSDN에서이 인터페이스가 사용되지 않습니다.

나에게 어떤 말을 할 수 있습니까? .net 4.5에서 ICloneable을 사용하는 것이 안전합니까?

답변

1

IClonable 인터페이스를 사용하면 안됩니다.

Here's a blog from Brad Abrams discussing why not 몇 년 전부터. 기본적으로, 이유는 팀 Schmelter의 대답에 의해 설명되어 있지만,이 블로그는 말의 입에서입니다.

직렬화를 통해 복제를 구현하는 것과 관련하여 StreamingContextStates.Clone을 지정하여 관리되지 않는 핸들과 같은 복제 작업을 더 잘 수행 할 수 있으므로 여기에서 약간 더 나은 방법을 사용할 수 있습니다.

이렇게되면 제프리 리히터에 의해 "C# 4 판을 통해 CLR"의 정식 구현있다 :

public static object DeepClone(object original) 
{ 
    using (var stream = new MemoryStream()) 
    { 
     var formatter = new BinaryFormatter 
     { 
      Context = new StreamingContext(StreamingContextStates.Clone) 
     }; 

     formatter.Serialize(stream, original); 
     stream.Position = 0; 

     return formatter.Deserialize(stream); 
    } 
} 

또는 강력한 형식의 변형 :

public static T DeepClone<T>(T original) 
{ 
    if (!typeof(T).IsSerializable) 
    { 
     throw new ArgumentException("The type must be serializable.", "original"); 
    } 

    if (ReferenceEquals(original, null)) 
    { 
     return default(T); 
    } 

    using (var stream = new MemoryStream()) 
    { 
     var formatter = new BinaryFormatter 
     { 
      Context = new StreamingContext(StreamingContextStates.Clone) 
     }; 

     formatter.Serialize(stream, original); 
     stream.Position = 0; 

     return (T) formatter.Deserialize(stream); 
    } 
} 

당신이 것을 사용한다라고 생각은 (가능한 경우) IClonable을 구현하는 대신

+0

답변 해 주셔서 감사합니다. Brad Abrams 지위도 오래되었습니다 (2004). 내 물건의 그림자 복제물이 필요해. Object.MemberwiseClone 메서드에 대해 어떻게 생각합니까? http://msdn.microsoft.com/en-us/library/system.object.memberwiseclone.aspx ps - serialize/deserialize 방식은 겉으로 보입니다.Allredy가 3 또는 4 개의 다른 구현을 찾았습니다 – jimpanzer

+0

pps 현재 제프리 리히터 (Jeffrey Richters)의 책을 읽었습니다) – jimpanzer

+0

@jimpanzer 직렬화 섹션을 읽으 셨다면 매우 흥미 롭습니다. ;) 어쨌든, 당신은 단지 얕은 복제를 원하지 않는 한, * shallow * 복제본이기 때문에'MemberwiseClone()'을 사용하지 않을 것입니다. –

3

IClonable은 단지 인터페이스이므로 을 구현하기 전까지는 아무 것도 수행하지 않습니다. IClonable을 사용하지 않을 것을 제안하는 게시물에는 이유가 언급되어 있습니다. Clone이 얕은 사본으로 구현되는지 여부는 명확하지 않습니다.

Copy 또는 DeepClone 방법을 제공하면 누구나 어떤 일이 발생하는지 알 수 있습니다.

견적은 두 용어를 설명합니다 :

중 하나 깊은, 또는 비 깊은 사본으로 ICloneable을 구현하는 일반적인 방법에는 두 가지가있다. 전체 복사본은 그래프에있는 모든 개체가 복사 될 때까지 복제 된 개체와 개체가 참조하는 모든 개체 을 반복적으로 복사합니다. . 상세하지 않은 사본 (최상위 레벨 참조 만 복사하는 경우 얕은이라고 함)은 전체 복사본의 일부 또는 전체 복사본을 수행 할 수 있습니다.

+0

답변 해 주셔서 감사합니다. 내 물건의 그림자 복제물이 필요해. Object.MemberwiseClone 메서드에 대해 어떻게 생각합니까? http://msdn.microsoft.com/en-us/library/system.object.memberwiseclone.aspx – jimpanzer