この記事は機械翻訳されています。英語版の記事を表示するには、[英語] のチェック ボックスをオンにしてください。また、テキストにマウス ポインターを合わせると、ポップアップ ウィンドウに英語のテキストを表示することもできます。
翻訳
英語

Object.MemberwiseClone メソッド ()

 

公開日: 2016年10月

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

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

protected object MemberwiseClone()

戻り値

Type: System.Object

現在の Object の簡易コピー。

MemberwiseCloneメソッドでは、シャロー コピーを作成して新しいオブジェクトの作成を新しいオブジェクトに現在のオブジェクトの非静的フィールドをコピーします。 フィールドが値型の場合、フィールドのビットごとのコピーは実行されます。 フィールドが参照型の場合、参照はコピーしますが、参照されるオブジェクトではありません。そのため、元のオブジェクトとその複製は、同じオブジェクトを参照します。

たとえば、オブジェクト A と B をさらに、参照の参照オブジェクト c です。 X と呼ばれるオブジェクトX の簡易コピーを作成もオブジェクト A と B を参照する新しいオブジェクト X2これに対し、X の詳細コピーが A2 と B2、A のコピーである新しいオブジェクトを参照する新しいオブジェクト X2 を作成し、B. B2 がさらに、c ドライブのコピーである新しいオブジェクト C2 を参照例は、shallow と詳細なコピー操作の違いを示しています。

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

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

  • 呼び出す、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 以降で使用可能
トップに戻る
表示: