C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#のコピーコンストラクターとは?基本の仕組みと実装例をわかりやすく解説

コピーコンストラクター(Copy Constructor)とは、既存のオブジェクトが持つ変数(フィールド)の値をコピーして、新しいオブジェクトを生成するためのコンストラクターです。C++では言語機能として自動的に用意されますが、C#では開発者が自分で定義する必要があります。

コピーコンストラクターの基本的な考え方

コピーコンストラクターは、引数として同じクラスのオブジェクトを受け取り、そのオブジェクトが保持している値を新しいインスタンスへ複製します。これにより、元のオブジェクトに影響を与えることなく、独立したコピーを作成することが可能になります。

サンプルコード

using System;
namespace Demo {
    class Student {
        private string name;
        private int rank;

        // コピーコンストラクター
        public Student(Student s) {
            name = s.name;
            rank = s.rank;
        }

        public Student(string name, int rank) {
            this.name = name;
            this.rank = rank;
        }

        public string Display {
            get {
                return " Student " + name +" got Rank "+ rank.ToString();
            }
        }
    }

    class StudentInfo {
        static void Main() {
            Student s1 = new Student("Jack", 2);

            // コピーコンストラクターを使用してコピー
            Student s2 = new Student(s1);

            // 表示
            Console.WriteLine(s2.Display);
            Console.ReadLine();
        }
    }
}

コードの解説

1. コピーコンストラクターの宣言

まず、引数に同じクラス型(Student)を受け取るコンストラクターを定義します。

public Student(Student s)

この中では、渡されたオブジェクト s が持つ各フィールドの値を、新しく生成されるインスタンスのフィールドに代入しています。これがコピーコンストラクターの本体部分です。

2. 元となるオブジェクトの作成

次に、通常のコンストラクターを使って Student クラスの新しいオブジェクトを生成します。

Student s1 = new Student("Jack", 2);

3. オブジェクトのコピー

続いて、s1 を引数として渡すことで、同じ値を持つ新しいオブジェクト s2 が生成されます。

Student s2 = new Student(s1);

このように、既存オブジェクトを引数にとって新しいインスタンスを作る仕組みこそが、コピーコンストラクターと呼ばれるものです。

まとめ

C#におけるコピーコンストラクターは、既存オブジェクトの状態をそのまま引き継いだ新しいオブジェクトを簡単に作成できる便利な手法です。特に、参照型のオブジェクトを安全に複製したい場合や、元のデータを保護しながら処理を行いたい場合に役立ちます。なお、配列やリストなど参照型のフィールドを持つクラスでは、浅いコピー(shallow copy)にならないよう、必要に応じてディープコピー(deep copy)を実装することも検討しましょう。

  1. Javaでコンストラクターにfinalを付けられないのはなぜ?理由とエラー例を解説

    Javaでメソッドにfinalを付けると、そのメソッドはオーバーライドできなくなります。つまり、サブクラス側でスーパークラスのfinalメソッドを再定義し、独自の実装を与えることはできません。メソッドをfinalにする本来の目的は、子クラスなど外部からの変更を防ぎ、動作を固定することにあります。コンストラクターは継承されない継承の仕組みでは、サブクラスはスーパークラスのほぼすべてのメンバーを受け継ぎますが、コンストラクターだけは例外です。言い換えると、Javaにおいてコンストラクターは継承されないため、コンストラクターをオーバーライドすること自体が不可能です。finalの役割は「オーバーライド

  2. サイバーパンク2077の偽コピー版マルウェアとは?感染経路と削除方法を徹底解説

    近年、ゲームソフトにマルウェアが仕込まれるケースが増えています。ゲームそのものがマルウェア配布の餌として使われたり、一見正規のゲームに悪意あるスクリプトやコードが注入されたりするのです。安全を確保するためには、Steamのような合法的で信頼できるゲームプラットフォームから正規のコピーを入手・ダウンロードすることが推奨されます。最近、今年大ヒットとなっているゲーム「Cyberpunk 2077」の偽コピーを配布するサイバー詐欺師の報告が相次いでいます。この偽コピーは一体何をするもので、手に入れてしまった場合はどうすればよいのでしょうか?これらの疑問に答える前に、まずこのアクションRPGについて簡