エクスポート (0) 印刷
すべて展開
この記事は機械翻訳されたものです。 記事の文章にポインターを重ねると、原文のテキストが表示されます。 詳細情報
訳文
原文

Object.MemberwiseClone メソッド

現在の Object の簡易コピーを作成します。

名前空間:  System
アセンブリ:  mscorlib (mscorlib.dll 内)

protected Object MemberwiseClone()

戻り値

型 : System.Object
現在の Object の簡易コピー。

MemberwiseClone メソッドは、新しいオブジェクトを作成し、現在のオブジェクトの非静的フィールドをその新しいオブジェクトにコピーすることによって、簡易コピーを作成します。 フィールドが値型の場合、そのフィールドはビット単位でコピーされます。 フィールドが参照型の場合、参照はコピーされますが、参照先オブジェクトはコピーされないため、元のオブジェクトとその複製は同じオブジェクトを参照します。

たとえば、オブジェクト A と B を参照する X と呼ばれるオブジェクトがあるとします。 次に、オブジェクト B がオブジェクト C を参照します。 X の簡易コピーでは、オブジェクト A と B を参照する新しいオブジェクト X2 が作成されます。 一方、X の詳細コピーでは新しいオブジェクト X2 が作成されます。このオブジェクトは、A と 2 のコピーである新しいオブジェクト A2 と B2 を参照します。 B2 は、C のコピーである新しいオブジェクト C2 を参照します。 この例は、簡易コピー操作と詳細コピー操作の違いを示しています。

MemberwiseClone メソッドによって実行される簡易コピー操作がニーズを満たさない場合、詳細コピー操作を実装する方法は多数あります。 次に例を示します。

  • コピーするオブジェクトのクラス コンストラクターを呼び出して、最初のオブジェクトから取得したプロパティ値で 2 番目のオブジェクトを作成します。 これは、オブジェクトの値が、クラス コンストラクターによって完全に定義されていることを前提としています。

  • MemberwiseClone メソッドを呼び出して、オブジェクトの簡易コピーを作成し、値が元のオブジェクトと同じ新しいオブジェクトを値が参照型のプロパティまたはフィールドに割り当てます。 例の中の DeepCopy メソッドは、このアプローチを示しています。

  • 詳細コピーされるオブジェクトをシリアル化した後、シリアル化されたデータを別のオブジェクト変数に復元します。

  • 再帰でリフレクションを使用して、詳細コピー操作を実行します。

MemberwiseClone メソッドの例を次に示します。 この例では、MemberwiseClone メソッドを呼び出して Person オブジェクトのシャロー コピー操作を実行する ShallowCopy メソッドを定義します。 また、Person オブジェクトの詳細コピー操作を実行する DeepCopy メソッドを定義します。


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 オブジェクトを返します。 出力を見るとわかるように、MemberwiseClone メソッドを呼び出すことによって Person オブジェクトが複製された場合、複製された 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