匯出 (0) 列印
全部展開
本文章是由機器翻譯。 將指標移到文章內的文字上方即可查看原文。 其他資訊。
譯文
原文

Object.MemberwiseClone 方法

建立目前 Object 的淺層複本 (Shallow Copy)。

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

protected Object MemberwiseClone()

傳回值

類型:System.Object
目前 Object 的淺層複本。

MemberwiseClone 方法會透過建立新物件,然後將目前物件的非靜態欄位複製到新物件,來建立淺層複本。 如果欄位是實值型別,則會一個位元接著一個位元對欄位執行複製。 如果欄位為參考型別 (Reference Type),則會複製參考,而不會複製被參考的物件;因此,原始物件和其複製品都會參考相同的物件。

例如,考慮名為 X 的 物件,它參考物件 A 與 B。 物件 B,依序為參考物件 C。 X 的淺層複本會建立也參考物件 A 和 B 的新物件 X2。 相反地,X 的深層複製會建立一個新的 X 2 物件,該物件會參考新的物件 A2 和 B2,亦即 A 和 B 的複本。 B2 會依序參考新物件 C2,也就是 C 的複本。 此範例說明淺層和深層複製作業之間的差異。

如果 MemberwiseClone 方法所執行的淺層複製作業不符合您的需要,有多個方法可以實作深層複製作業。 這些需求包括下列各項:

  • 呼叫所要複製之物件的類別建構函式,以取自第一個物件的屬性值來建立第二個物件。 這是假設物件的值完全是由其類別建構函式所定義。

  • 呼叫 MemberwiseClone 方法以建立物件的淺層複製 (Shallow Copy),然後將值與原始物件相同的新物件指派給值為參考型別的任何屬性或欄位。 範例中的 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(this.IdInfo.IdNumber);
       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 = (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);

        // 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


在這個範例中,Person.IdInfo 屬性會傳回 IdInfo 物件。 如範例的輸出所示,當 Person 物件是透過呼叫 MemberwiseClone 方法所複製,則複製的 Person 物件是原始物件的獨立複本,但是它們會共用相同的 Person.IdInfo 物件參考。 因此,修改複製品的 Person.IdInfo 屬性會變更原始物件的 Person.IdInfo 屬性。 另一方面,執行深層複製作業時,可以修改複製的 Person 物件,包括其 Person.IdInfo 屬性,而不會影響原始物件。

.NET Framework

支援版本:4.5.2、4.5.1、4.5、4、3.5、3.0、2.0、1.1、1.0

.NET Framework Client Profile

支援版本:4、3.5 SP1

可攜式類別庫

支援版本:可攜式類別庫

適用於 Windows 市集應用程式的 .NET

支援版本:Windows 8

適用於 Windows Phone 應用程式的 .NET

支援版本:Windows Phone 8、Silverlight 8.1

Windows Phone 8.1, Windows Phone 8, Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (不支援伺服器核心角色), Windows Server 2008 R2 (SP1 (含) 以後版本支援伺服器核心角色,不支援 Itanium)

.NET Framework 並不支援各種平台的所有版本。如需支援版本的清單,請參閱.NET Framework 系統需求

社群新增項目

新增
顯示:
© 2014 Microsoft