.NETエンジニア・プログラマ向けの技術情報・業界ニュースをお届けします。

  1. FEnet.NETナビ
  2. .NETコラム
  3. プログラミング言語
  4. C#
  5. C#のコンストラクタを基本から解説!|様々なコンストラクタを使いこなそう

C#のコンストラクタを基本から解説!|様々なコンストラクタを使いこなそう

  • C#
  • プログラミング言語
公開日時:   更新日時:
C#のコンストラクタを基本から解説!|様々なコンストラクタを使いこなそう
この記事でわかること
    基本情報技術者試験の試験対策はこちら>>
    システム
    エンジニア
    C#のコンストラクタにはどのような種類や機能があるのですか。
    プロジェクト
    マネージャー
    コンストラクタはクラスの基本です。コンストラクタについて詳しくご紹介しましょう。

    C#のコンストラクタとは?


    C#のクラスを使う上で、コンストラクタは欠かせません。コンストラクタとはクラスがnewでインスタンスとして生成された時に、初期化を行うためのメソッドです。

    以下のようなクラス名と同名のメソッドがコンストラクタです。

    class TestClass
    {
    private int value;
    public TestClass() // コンストラクタ
    {
    // ここで初期化を行う
    value = 0;
    }
    }

    コンストラクタには普通のメソッドのようなvoidやintといった戻り値の型は不要です。コンストラクタは値を返さないからです。

    コンストラクタはnewした時に呼ばれる

    コンストラクタはnewでインスタンスを生成した時に呼ばれます。
    以下のC#サンプルをご覧下さい。

    using System;
    class TestClass
    {
    public TestClass()
    {
    Console.WriteLine(“コンストラクタが呼ばれました。”);
    }

    public static void Main()
    {
    TestClass t = new TestClass();
    }
    }

    実行すると以下が表示されます。newをすればコンストラクタが呼ばれます。

    コンストラクタが呼ばれました。

    コンストラクタにはパラメータを渡せる

    コンストラクタはパラメータとして値を渡すことができます。

    以下のC#サンプルをご覧ください。

    class TestClass
    {
    private int val;
    private string str;
    public TestClass(int val, string str)
    {
    this.val = val;
    this.str = str;
    }
    }

    このようにコンストラクタで初期化する値を渡すことができます。なおthis.とはクラスのメンバを意味します。コンストラクタのパラメータとクラスのフィールド名が同じ場合は、this.を付けることで区別できます。

    コンストラクタは複数持つことができる

    コンストラクタは複数持つことが可能です。

    以下のC#サンプルをご覧ください。

    class TestClass
    {
    public int val;
    public string str;

    public TestClass()
    {
    val = 0;
    str = “”;
    }
    public TestClass(int val, string str)
    {
    this.val = val;
    this.str = str;
    }
    }

    複数の同名コンストラクタを使い分けよう

    上のC#サンプルのクラスは、以下のように呼び出すことができます。

    public static void Main()
    {
    TestClass t1 = new TestClass();
    TestClass t2 = new TestClass(3, “長嶋”);
    Console.WriteLine(t1.val);
    Console.WriteLine(t2.val);
    }

    実行結果は、

    0
    3

    です。なおこのように同じ名前のメソッドを複数持つことをオーバーロードと言います。コンストラクタ以外のメソッドでもオーバーロードは可能です。

    コンストラクタ初期化子

    上のC#サンプルは、以下のように書くこともできます。

    class TestClass
    {
    public int val;
    public string str;

    public TestClass() : this(0, “”)
    {
    }
    public TestClass(int val, string str)
    {
    this.val = val;
    this.str = str;
    }
    }

    this(0, “”)はコンストラクタ初期化子と言います。これでパラメータ無しでnewされた時に、TestClass(int val, string str)の方のコンストラクタを呼び出して、指定のパラメータで初期化できるのです。なおコンストラクタ初期化子はコンストラクタの処理よりも先に実行されます。

    ラムダ式のコンストラクタ

    コンストラクタには=>のラムダ式が使用できます。

    ただしラムダ式が使えるのはコンストラクタのパラメータが1つだけの場合です。代入以外の初期化処理も記述できないので、使う機会はあまりないかもしれません。

    静的コンストラクタ

    C#にはstaticなフィールドを初期化するための静的コンストラクタという機能があります。コンストラクタにstaticを付ければそれができます。

    静的コンストラクタにもラムダ式が使える

    上のC#サンプルを実行すると、以下のように表示されます。

    静的メンバです。

    なお静的コンストラクタも以下のようにラムダ式を使えます。普通のコンストラクタよりこちらの方が使用する機会があるかもしれません。

    class TestClass
    {
    public static string str;

    static TestClass() => str = “静的メンバです。”;
    }

    静的コンストラクタはパラメータを持てない、直接呼び出せない、オーバーロードできないといった制約があります。また静的コンストラクタが呼ばれるタイミングは、静的フィールドにアクセスする前であることが保障されています。

    静的コンストラクタはreadonlyのフィールドの値を設定できる

    静的コンストラクタは読み取り専用のstatic readonlyのフィールドに値を設定できます。

    class TestClass
    {
    public static readonly string str;

    static TestClass()
    {
    str = “readonly文字列”;
    }
    }

    静的コンストラクタを使わず以下のように宣言時に初期化することもできますが、初期化処理を一か所にまとめたい場合は便利です。

    public static readonly string str = “readonly文字列”;

    privateなコンストラクタ

    コンストラクタをpublicではなくprivateにすると、newできないようにすることが可能です。

    以下のC#サンプルをご覧ください。

    class TestClass
    {
    public string str;
    private TestClass()
    {
    }
    public TestClass(string str)
    {
    this.str = str;
    }
    }

    このクラスでnew TestClass()とするとprivateのためアクセスできず、エラーになります。ただしnew TestClass(“文字列”)は可能です。必ずパラメータを指定してnewして欲しい時に有効です。

    なお一切newさせたくない場合は、全てのコンストラクタをprivateにするのではなく、abstructやinterface、staticクラスを利用する方が意図が明確になって良いでしょう。

    デストラクタの使用は非推奨

    C#にはコンストラクタと対になるデストラクタがあります。

    class TestClass
    {
    public TestClass()
    {
    }
    ~TestClass()
    {
    }
    }

    この~TestClass()がデストラクタです。デストラクタはnewされたクラスのインスタンスが解放された時に呼ばれます。ただし、C#が動作する.Net Frameworkは、インスタンスをいつ開放するかは明確になっていません。

    そのためデストラクタはいつ呼ばれるのかが分かりません。確実性が無い機能なので使用しない方がよいでしょう。デストラクタはC++という古い言語にある機能で、C#でそれをとりあえず引きついだという背景があります。

    システム
    エンジニア
    コンストラクタにはいろいろな機能があるのですね。
    プロジェクト
    マネージャー
    その通りです。コンストラクタはクラスの基本ですから、しっかり理解してください。

    様々なコンストラクタを使いこなそう

    コンストラクタについて解説しましたが、いかがでしたでしょうか。

    コンストラクタはクラスの基本ですが、知らない機能もいくつかあったのではないかと思います。是非活用して優れたC#プログラムを作ってください。

    FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
    株式会社オープンアップシステムロゴ

    株式会社オープンアップシステムはこんな会社です

    秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
    数多くのエンジニアが集まります。

    秋葉原オフィスイメージ
    • スマホアプリから業務系システムまで

      スマホアプリから業務系システムまで

      スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。

    • 充実した研修制度

      充実した研修制度

      毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。

    • 資格取得を応援

      資格取得を応援

      スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。

    • 東証プライム上場企業グループ

      東証プライム上場企業グループ

      オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。

      安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。

    株式会社オープンアップシステムに興味を持った方へ

    株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。

    年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
    まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。

    株式会社オープンアップシステムへのご応募はこちら↓
    株式会社オープンアップシステムへのご応募はこちら↓

    C#新着案件New Job