C# でオブジェクトをコピーする
このチュートリアルでは、C# でオブジェクトをコピーする方法を紹介します。
C# の MemberWiseClone()
メソッドを使用してオブジェクトをコピーする
残念ながら、C# でオブジェクトの個別のコピーを作成する組み込みの方法はありません。この現象は、次のコード例で示されています。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace copy_an_object {
class myClass {
public String test;
}
class Program {
static void Main(string[] args) {
myClass a = new myClass();
a.test = "This is a test";
myClass b = a;
b.test = "This is not a test";
Console.WriteLine(a.test);
Console.WriteLine(b.test);
}
}
}
出力:
This is not a test
This is not a test
C# のクラスのインスタンスは特定のメモリ位置を指す参照型変数であるため、どちらの場合も同じ出力が得られます。C# のオブジェクト指向の性質により、新しいポインタ b
も a
のメモリ位置を指しています。
b
用に別のメモリ位置を作成する場合は、いくつかのユーザー定義のアプローチに依存する必要があります。MemberWiseClone()
メソッドは、C# で呼び出し元オブジェクトの値の個別のコピーを作成するために使用されます。MemberWiseClone()
関数の戻り型はオブジェクトです。次のコード例は、C# で MemberWiseClone()
関数を使用してクラスオブジェクトの個別のコピーを作成する方法を示しています。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace copy_an_object {
class myClass {
public String test;
public object Clone() {
return this.MemberwiseClone();
}
}
class Program {
static void Main(string[] args) {
myClass a = new myClass();
a.test = "This is a test";
myClass b = (myClass)a.Clone();
b.test = "This is not a test";
Console.WriteLine(a.test);
Console.WriteLine(b.test);
}
}
}
出力:
This is a test
This is not a test
今回は、出力から、クラスオブジェクトごとに個別のコピーがあることが明らかです。myClass
クラスの Clone()
関数内に MemberWiseClone()
関数を実装しました。Clone()
関数は、クラスオブジェクトの個別のコピーを返します。Clone()
関数の戻り値は myClass
に型キャストされ、b
クラスオブジェクトによってポイントされます。
C# のパラメーター化されたコンストラクターメソッドを使用してオブジェクトをコピーする
C# で同じ目標を達成するために、パラメーター化されたクラスコンストラクターを作成できます。前のクラスオブジェクトを新しいクラスオブジェクトのコンストラクターに渡し、そこからすべての値をコピーできます。次のコード例は、C# でパラメーター化されたコンストラクターメソッドを使用してクラスオブジェクトの個別のコピーを作成する方法を示しています。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace copy_an_object {
class MyClass {
public String test;
public MyClass() {}
public MyClass(MyClass other) {
test = other.test;
}
}
class Program {
static void Main(string[] args) {
MyClass a = new myClass();
a.test = "This is a test";
MyClass b = new MyClass(a);
b.test = "This is not a test";
Console.WriteLine(a.test);
Console.WriteLine(b.test);
}
}
}
出力:
This is a test
This is not a test
MyClass
クラスのオブジェクトを取得し、そこから test
文字列をコピーする MyClass
クラスのパラメーター化されたコンストラクターを作成しました。main
関数で、MyClass
クラスのオブジェクト a
を作成し、それを b
のコンストラクターに渡しました。
Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.
LinkedIn