그것은 기본적으로 MemberwiseClone
MSDN documentation에 설명 된 것 :
MemberwiseClone 방법은 새로운 객체를 생성 한 다음 새 객체에 현재 객체의 비 정적 필드를 복사하여 단순 복사본을 만듭니다. 필드가 값 유형이면 필드의 비트 별 사본이 수행됩니다. 필드가 참조 유형 인 경우 참조가 복사되지만 참조 된 객체는 복사되지 않습니다. 따라서 원래 개체와 해당 개체의 복제본은 동일한 개체를 참조합니다.
위의 실제 구현은 CLR에 의해 내부적으로 구현됩니다. 당신은 다음과 같은 표준 C# 코드의 최적화 된 변종으로 생각 할 수 있습니다
using System.Reflection;
using System.Runtime.Serialization;
public static object CustomMemberwiseClone(object source)
{
var clone = FormatterServices.GetUninitializedObject(source.GetType());
for (var type = source.GetType(); type != null; type = type.BaseType)
{
var fields = type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly);
foreach (var field in fields)
field.SetValue(clone, field.GetValue(source));
}
return clone;
}
즉, 실제의 형태를 얻을 수있는 생성자를 호출하지 않고 해당 유형 의 새로운 인스턴스를 생성하고 각 인스턴스 필드의 값을 복사 소스 객체.
다시 말하면, 실제 내부 구현은 (주석에서 지적한 바와 같이) 위의 스 니펫은 원리를 보여 주며 반사를 통해 동일한 의미론으로 메소드를 구현하는 방법입니다 (물론 훨씬 느릴 것입니다 CLR 방법보다).
영업 시간에 추가 : 자세한 내용은 아래에서 Ivan의 의견을 참조하십시오. 나는이 부분을 그의 대답으로 생각하고 그것을 바탕으로 받아 들일 것이다.
요즘에는 디 컴파일러가 필요하지 않습니다. [참조 소스] (https://referencesource.microsoft.com/#mscorlib/system/object.cs,1556d8bb3f97be20)는 메소드가 런타임 자체 (MethodImplOptions.InternalCall)에 의해 구현되었음을 알려줍니다. 여기에서 CoreClr github repo로 이동하여 통화를 검색하십시오. 귀하의 경우에는 원하는 구현이 포함 된 [이 파일] (https://github.com/dotnet/coreclr/blob/master/src/classlibnative/bcltype/objectnative.cpp)을 찾을 수 있습니다 (ObjectNative : : 복제). – thehennyy
감사합니다, @thehennyy, 이제 참조 코드에서 물건을 찾는 방법에 대해 더 많이 알고 있지만 C++은 10 년 뒤에 있습니다. 그리고 나는'ObjectNative :: Clone'이 무엇을하는지 전혀 모릅니다. 이 질문을 통해 내가 알고 싶은 것은 그 사물을 복제하는 데 어떤 원리가 사용되는지입니다. 그것을 C++로 보는 것은 바이트 복사를위한 직접 바이트를 수행하는 것입니까? – ProfK
세계에서이 질문을 "너무 광범위하게"찾아 투표를 종료 할 수 있습니까? 매우 구체적인 질문을 하나만하고 있습니다. 대답은 매우 제한되어 있습니다. 제목은 질문입니다. 그것을 더미로 읽으십시오. – ProfK