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