本文為機器翻譯文章。如需檢視英文版,請選取 [原文] 核取方塊。您也可以將滑鼠指標移到文字上,即可在快顯視窗顯示英文原文。
譯文
原文

Object.MemberwiseClone 方法 ()

 

建立目前 Object 的淺層複製。

命名空間:   System
組件:  mscorlib (於 mscorlib.dll)

protected object MemberwiseClone()

傳回值

Type: System.Object

目前 Object 的淺層複製。

MemberwiseClone方法建立新的物件,並再將目前物件的非靜態欄位複製到新的物件建立淺層複本。 如果欄位是實值類型,則會執行位元欄位的複本。 如果欄位是參考類型,則會複製參考,但參考的物件不;因此,原始的物件和其複製參考相同的物件。

例如,請考慮 x 依次參考物件 A 和 B 參考物件 c。X 的淺層複本建立新的物件 X2 參考物件 A 和 b。相反地,X 的深層複本建立新物件 X2 A2 與 B2 a 的新物件和 B.B2 參考新物件 C2,也就是一份 c。此範例說明 shallow 和深層複製作業之間的差異。

透過深層複製作業,實作時所執行的淺層複製作業的許多方式MemberwiseClone方法不符合您的需求。 這些需求包括下列各項:

  • 呼叫類別建構函式要複製到取自第一個物件的屬性值建立第二個物件的物件。 這是假設物件的值會完全由其類別建構函式。

  • 呼叫MemberwiseClone方法來建立物件的淺層複本,並將指派其值為與原始物件的任何屬性或欄位的值是參考型別相同的新物件。 DeepCopy方法在此範例將示範這個方法。

  • 序列化物件變成深層複製,,然後還原序列化的資料至不同的物件變數。

  • 使用反映遞迴時,以執行深層複製作業。

下列範例說明MemberwiseClone方法。 它會定義ShallowCopy方法呼叫MemberwiseClone方法上執行的淺層複製作業Person物件。 它也會定義DeepCopy執行深層複製作業的方法Person物件。

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

In this example, the Person.IdInfo property returns an IdInfo object. As the output from the example shows, when a Person object is cloned by calling the M:System.Object.MemberwiseClone method, the cloned Person object is an independent copy of the original object, except that they share the same Person.IdInfo object reference. As a result, modifying the clone's Person.IdInfo property changes the original object's Person.IdInfo property. 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.

通用 Windows 平台
自 8 起供應
.NET Framework
自 1.1 起供應
可攜式類別庫
提供支援︰ 可攜式 .NET 平台
Silverlight
自 2.0 起供應
Windows Phone Silverlight
自 7.0 起供應
Windows Phone
自 8.1 起供應
回到頁首
顯示: