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
을 구현하는 대신
답변 해 주셔서 감사합니다. Brad Abrams 지위도 오래되었습니다 (2004). 내 물건의 그림자 복제물이 필요해. Object.MemberwiseClone 메서드에 대해 어떻게 생각합니까? http://msdn.microsoft.com/en-us/library/system.object.memberwiseclone.aspx ps - serialize/deserialize 방식은 겉으로 보입니다.Allredy가 3 또는 4 개의 다른 구현을 찾았습니다 – jimpanzer
pps 현재 제프리 리히터 (Jeffrey Richters)의 책을 읽었습니다) – jimpanzer
@jimpanzer 직렬화 섹션을 읽으 셨다면 매우 흥미 롭습니다. ;) 어쨌든, 당신은 단지 얕은 복제를 원하지 않는 한, * shallow * 복제본이기 때문에'MemberwiseClone()'을 사용하지 않을 것입니다. –