C# でオブジェクトをコピーする

Muhammad Maisam Abbas 2024年2月16日
  1. C# の MemberWiseClone() メソッドを使用してオブジェクトをコピーする
  2. C# のパラメーター化されたコンストラクターメソッドを使用してオブジェクトをコピーする
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# のオブジェクト指向の性質により、新しいポインタ ba のメモリ位置を指しています。

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 のコンストラクターに渡しました。

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

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

関連記事 - Csharp Class