Object.MemberwiseClone メソッド

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

Protected Function MemberwiseClone() As Object
[C#]
protected object MemberwiseClone();
[C++]
protected: Object* MemberwiseClone();
[JScript]
protected function MemberwiseClone() : Object;

戻り値

現在の Object の簡易コピー。

解説

MemberwiseClone をオーバーライドすることはできません。また、アクセスできるのは、このクラスまたは派生クラスを使用した場合に限られます。オブジェクトの詳細コピーまたは簡易コピーをユーザーに公開する必要がある場合は、 ICloneable インターフェイスを実装したクラスを使用します。

簡易コピーでは、元のオブジェクトと同じ型の新しいインスタンスが作成され、元のオブジェクトの非静的フィールドがコピーされます。フィールドが値型の場合、そのフィールドはビット単位でコピーされます。フィールドが参照型の場合、参照はコピーされますが、参照されるオブジェクトはコピーされないため、元のオブジェクトの参照とクローンの参照は同一のオブジェクトを指します。対照的に、オブジェクトの詳細コピーでは、そのオブジェクト内のフィールドが直接的または間接的に参照するすべての対象がコピーされます。

たとえば、X がオブジェクト A と B を参照する Object であり、オブジェクト A がオブジェクト M を参照している場合には、X の簡易コピーであるオブジェクト Y は、オブジェクト A と B を参照します。対照的に、X の詳細コピーであるオブジェクト Y は、オブジェクト C とオブジェクト D を直接参照し、オブジェクト N を間接参照します。この場合のオブジェクト C は A のコピー、D は B のコピー、N は M のコピーです。

クローンの Type の型は、元の Object の型と同じです。

使用例

MemberwiseClone を使用してクラスのインスタンスをコピーする方法のコード例を次に示します。

 

Imports System

Class MyBaseClass
   Public Shared CompanyName As String = "My Company"
   Public age As Integer
   Public name As String
End Class 'MyBaseClass

Class MyDerivedClass
   Inherits MyBaseClass

   Shared Sub Main()

      ' Creates an instance of MyDerivedClass and assign values to its fields.
      Dim m1 As New MyDerivedClass()
      m1.age = 42
      m1.name = "Sam"

      ' Performs a shallow copy of m1 and assign it to m2.
      Dim m2 As MyDerivedClass = CType(m1.MemberwiseClone(), MyDerivedClass)

   End Sub 'Main

End Class 'MyDerivedClass

[C#] 
using System;

class MyBaseClass {
   public static string CompanyName = "My Company";
   public int age;
   public string name;
}

class MyDerivedClass: MyBaseClass {

   static void Main() {
   
   // Creates an instance of MyDerivedClass and assign values to its fields.
   MyDerivedClass m1 = new MyDerivedClass();
   m1.age = 42;
   m1.name = "Sam";

   // Performs a shallow copy of m1 and assign it to m2.
   MyDerivedClass m2 = (MyDerivedClass) m1.MemberwiseClone();
   }
}

[C++] 
#using <mscorlib.dll>

using namespace System;

__gc class MyBaseClass
{
public:
   static String* CompanyName;
   int age;
   String* name;
};

__gc class MyDerivedClass : public MyBaseClass
{
public:
   static void Test()
   {
      // Creates an instance of MyDerivedClass and assign values to its fields.
      MyDerivedClass* m1 = new MyDerivedClass();
      m1->age = 42;
      m1->name = S"Sam";

      // Performs a shallow copy of m1 and assign it to m2.
      MyDerivedClass* m2 = __try_cast<MyDerivedClass*>(m1->MemberwiseClone());
   }
};

int main()
{
   MyDerivedClass::Test();
}

[JScript] 
import System

class MyBaseClass {
   public static var CompanyName : String = "My Company";
   public var age : int;
   public var name : String;
}

class MyDerivedClass extends MyBaseClass {

   static function Main() {
   
   // Creates an instance of MyDerivedClass and assign values to its fields.
   var m1 : MyDerivedClass = new MyDerivedClass();
   m1.age = 42;
   m1.name = "Sam";

   // Performs a shallow copy of m1 and assign it to m2.
   var m2 : MyDerivedClass = MyDerivedClass(m1.MemberwiseClone());
   }
}

必要条件

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ, .NET Compact Framework - Windows CE .NET, Common Language Infrastructure (CLI) Standard

参照

Object クラス | Object メンバ | System 名前空間 | ICloneable