Object.MemberwiseClone Method

정의

현재 Object의 단순 복사본을 만듭니다. Creates a shallow copy of the current Object.

protected object MemberwiseClone ();
반환

현재 Object의 단순 복사본입니다. A shallow copy of the current Object.

예제

다음 예제는 MemberwiseClone 메서드.The following example illustrates the MemberwiseClone method. 정의 ShallowCopy 메서드를 호출 하는 MemberwiseClone 단순 복사 작업을 수행 하는 방법을 Person 개체입니다.It defines a ShallowCopy method that calls the MemberwiseClone method to perform a shallow copy operation on a Person object. 또한 정의 DeepCopy 에서 전체 복사 작업을 수행 하는 메서드를 Person 개체입니다.It also defines a DeepCopy method that performs a deep copy operation on a Person object.

using System;

public class IdInfo
{
    public int IdNumber;
    
    public IdInfo(int IdNumber)
    {
        this.IdNumber = IdNumber;
    }
}

public class Person 
{
    public int Age;
    public string Name;
    public IdInfo IdInfo;

    public Person ShallowCopy()
    {
       return (Person) this.MemberwiseClone();
    }

    public Person DeepCopy()
    {
       Person other = (Person) this.MemberwiseClone();
       other.IdInfo = new IdInfo(IdInfo.IdNumber);
       other.Name = String.Copy(Name);
       return other;
    }
}

public class Example
{
    public static void Main()
    {
        // Create an instance of Person and assign values to its fields.
        Person p1 = new Person();
        p1.Age = 42;
        p1.Name = "Sam";
        p1.IdInfo = new IdInfo(6565);

        // Perform a shallow copy of p1 and assign it to p2.
        Person p2 = p1.ShallowCopy();

        // Display values of p1, p2
        Console.WriteLine("Original values of p1 and p2:");
        Console.WriteLine("   p1 instance values: ");
        DisplayValues(p1);
        Console.WriteLine("   p2 instance values:");
        DisplayValues(p2);
        
        // Change the value of p1 properties and display the values of p1 and p2.
        p1.Age = 32;
        p1.Name = "Frank";
        p1.IdInfo.IdNumber = 7878;
        Console.WriteLine("\nValues of p1 and p2 after changes to p1:");
        Console.WriteLine("   p1 instance values: ");
        DisplayValues(p1);
        Console.WriteLine("   p2 instance values:");
        DisplayValues(p2);

        // Make a deep copy of p1 and assign it to p3.
        Person p3 = p1.DeepCopy();
        // Change the members of the p1 class to new values to show the deep copy.
        p1.Name = "George";
        p1.Age = 39;
        p1.IdInfo.IdNumber = 8641;
        Console.WriteLine("\nValues of p1 and p3 after changes to p1:");
        Console.WriteLine("   p1 instance values: ");
        DisplayValues(p1);
        Console.WriteLine("   p3 instance values:");
        DisplayValues(p3);
    }

    public static void DisplayValues(Person p)
    {
        Console.WriteLine("      Name: {0:s}, Age: {1:d}", p.Name, p.Age);
        Console.WriteLine("      Value: {0:d}", p.IdInfo.IdNumber);
    }
}
// The example displays the following output:
//       Original values of p1 and p2:
//          p1 instance values:
//             Name: Sam, Age: 42
//             Value: 6565
//          p2 instance values:
//             Name: Sam, Age: 42
//             Value: 6565
//       
//       Values of p1 and p2 after changes to p1:
//          p1 instance values:
//             Name: Frank, Age: 32
//             Value: 7878
//          p2 instance values:
//             Name: Sam, Age: 42
//             Value: 7878
//       
//       Values of p1 and p3 after changes to p1:
//          p1 instance values:
//             Name: George, Age: 39
//             Value: 8641
//          p3 instance values:
//             Name: Frank, Age: 32
//             Value: 7878
Public Class IdInfo
    Public IdNumber As Integer
    
    Public Sub New(IdNumber As Integer)
        Me.IdNumber = IdNumber
    End Sub
End Class

Public Class Person 
    Public Age As Integer
    Public Name As String
    Public IdInfo As IdInfo

    Public Function ShallowCopy() As Person
       Return DirectCast(Me.MemberwiseClone(), Person)
    End Function

    Public Function DeepCopy() As Person
       Dim other As Person = DirectCast(Me.MemberwiseClone(), Person) 
       other.IdInfo = New IdInfo(IdInfo.IdNumber)
       other.Name = String.Copy(Name)
       Return other
    End Function
End Class

Module Example
   Public Sub Main()
        ' Create an instance of Person and assign values to its fields.
        Dim p1 As New Person()
        p1.Age = 42
        p1.Name = "Sam"
        p1.IdInfo = New IdInfo(6565)

        ' Perform a shallow copy of p1 and assign it to p2.
        Dim p2 As Person = p1.ShallowCopy()

        ' Display values of p1, p2
        Console.WriteLine("Original values of p1 and p2:")
        Console.WriteLine("   p1 instance values: ")
        DisplayValues(p1)
        Console.WriteLine("   p2 instance values:")
        DisplayValues(p2)
        Console.WriteLine()
                
        ' Change the value of p1 properties and display the values of p1 and p2.
        p1.Age = 32
        p1.Name = "Frank"
        p1.IdInfo.IdNumber = 7878
        Console.WriteLine("Values of p1 and p2 after changes to p1:")
        Console.WriteLine("   p1 instance values: ")
        DisplayValues(p1)
        Console.WriteLine("   p2 instance values:")
        DisplayValues(p2)
        Console.WriteLine()
        
        ' Make a deep copy of p1 and assign it to p3.
        Dim p3 As Person = p1.DeepCopy()
        ' Change the members of the p1 class to new values to show the deep copy.
        p1.Name = "George"
        p1.Age = 39
        p1.IdInfo.IdNumber = 8641
        Console.WriteLine("Values of p1 and p3 after changes to p1:")
        Console.WriteLine("   p1 instance values: ")
        DisplayValues(p1)
        Console.WriteLine("   p3 instance values:")
        DisplayValues(p3)
   End Sub
   
    Public Sub DisplayValues(p As Person)
        Console.WriteLine("      Name: {0:s}, Age: {1:d}", p.Name, p.Age)
        Console.WriteLine("      Value: {0:d}", p.IdInfo.IdNumber)
    End Sub
End Module
' The example displays the following output:
'       Original values of m1 and m2:
'          m1 instance values:
'             Name: Sam, Age: 42
'             Value: 6565
'          m2 instance values:
'             Name: Sam, Age: 42
'             Value: 6565
'       
'       Values of m1 and m2 after changes to m1:
'          m1 instance values:
'             Name: Frank, Age: 32
'             Value: 7878
'          m2 instance values:
'             Name: Sam, Age: 42
'             Value: 7878
'       
'       Values of m1 and m3 after changes to m1:
'          m1 instance values:
'             Name: George, Age: 39
'             Value: 8641
'          m3 instance values:
'             Name: Frank, Age: 32
'             Value: 7878

이 예제에서는 합니다 Person.IdInfo 속성이 반환을 IdInfo 개체입니다.In this example, the Person.IdInfo property returns an IdInfo object. 예제에서 출력으로 경우는 Person 개체를 호출 하 여 복제를 MemberwiseClone 메서드를 선택 하 여 복제 된 Person 개체가 원래 개체의 독립적인 복사본을 동일한 공유 한다는 점을 제외 하면 Person.IdInfo 개체 참조입니다.As the output from the example shows, when a Person object is cloned by calling the MemberwiseClone method, the cloned Person object is an independent copy of the original object, except that they share the same Person.IdInfo object reference. 결과적으로 복제본의 수정 Person.IdInfo 속성에는 원래 개체의 변경 Person.IdInfo 속성입니다.As a result, modifying the clone's Person.IdInfo property changes the original object's Person.IdInfo property. 반면에 전체 복사 작업을 수행 될 때 복제 된 Person 개체를 포함 하 여 해당 Person.IdInfo 원래 개체에 영향을 주지 않고 속성을 수정할 수 있습니다.On the other hand, when a deep copy operation is performed, the cloned Person object, including its Person.IdInfo property, can be modified without affecting the original object.

설명

MemberwiseClone 메서드는 새 개체를 만들고 다음 새 개체를 현재 개체의 비정적 필드를 복사 하 여 단순 복사본을 만듭니다.The MemberwiseClone method creates a shallow copy by creating a new object, and then copying the nonstatic fields of the current object to the new object. 필드 값 형식이 면 필드를 비트 단위로 복사가 수행 됩니다.If a field is a value type, a bit-by-bit copy of the field is performed. 필드 참조 형식이 면 참조가 복사 되 고 이지만 참조 된 개체는 없습니다. 따라서 원래 개체 및 해당 복제본 같은 개체를 참조 하세요.If a field is a reference type, the reference is copied but the referred object is not; therefore, the original object and its clone refer to the same object.

예를 들어 참조 개체 C는 개체 및 개체 B를 참조 하는 X 라는 개체 X의 단순 복사본을 만들고 개체 A 및 B를 참조 하는 새 개체 X2 반면, X의 전체 복사본을 A2 및 B2, A의 복사본 인 새 개체를 참조 하는 새 개체 X2 만들고 B. B2 C의 복사본 인 새 개체 C2, 참조 예제는 단순 하 고 전체 복사 작업의 차이점을 보여 줍니다.For example, consider an object called X that references objects A and B. Object B, in turn, references object C. A shallow copy of X creates new object X2 that also references objects A and B. In contrast, a deep copy of X creates a new object X2 that references the new objects A2 and B2, which are copies of A and B. B2, in turn, references the new object C2, which is a copy of C. The example illustrates the difference between a shallow and a deep copy operation.

단순 복사 작업을 수행한 경우 전체 복사 작업을 구현 하는 방법은 여러 가지가 MemberwiseClone 메서드 요구를 충족 하지 않습니다.There are numerous ways to implement a deep copy operation if the shallow copy operation performed by the MemberwiseClone method does not meet your needs. 이러한 요구 사항은 다음과 같습니다.These include the following:

  • 첫 번째 개체에서 가져온 속성 값을 사용 하 여 두 번째 개체를 만들려는 복사 대상 개체의 클래스 생성자를 호출 합니다.Call a class constructor of the object to be copied to create a second object with property values taken from the first object. 이 개체의 값을 클래스 생성자에 의해 완전히 정의 되어 있는지 가정 합니다.This assumes that the values of an object are entirely defined by its class constructor.

  • 호출 된 MemberwiseClone 메서드를 개체의 단순 복사본을 만들고 해당 값은 속성 또는 필드 값은 참조 형식에 원래 개체와 동일한 새 개체를 할당 합니다.Call the MemberwiseClone method to create a shallow copy of an object, and then assign new objects whose values are the same as the original object to any properties or fields whose values are reference types. DeepCopy 메서드 예제에서에서는이 방법을 보여 줍니다.The DeepCopy method in the example illustrates this approach.

  • 복사 심층 되도록 개체를 serialize 하 고 다양 한 개체 변수를 serialize 된 데이터를 복원 합니다.Serialize the object to be deep copied, and then restore the serialized data to a different object variable.

  • 리플렉션을 사용 하 여 재귀를 사용 하 여 심층 복사 작업을 수행 합니다.Use reflection with recursion to perform the deep copy operation.

적용 대상