• ホーム
  • C#
  • C#でクラスのフィールド宣言とコンストラクターでの初期化はどっちが優先する?

C#でクラスのフィールド宣言とコンストラクターでの初期化はどっちが優先する?

C#では、クラスからインスタンスを生成したときに自動的に呼び出されるコンストラクターというメソッドがあります。インスタンス生成時に自動的に呼び出されるので、インスタンスの初期化に使われます。では、フィールドの宣言と同時に初期値を設定しつつ、コンストラクターでもそのフィールドの初期値を設定した場合には、どちらが優先するのでしょうか。

目次

  1. 試してみた
  2. まとめ

試してみた

簡単なコンソールアプリを作って試してみました。「ClassAというクラスのインスタンスを生成して、そのフィールドの値をコンソールに出力する。」という簡単なアプリです。 まず、コンストラクターで初期化をしない場合です。

using System;

namespace constructor_trial
{
    class Program
    {
        static void Main(string[] args)
        {
            ClassA instanceA = new ClassA("コンストラクターで指定");
            Console.WriteLine(instanceA.TextString);
        }
    }
}
namespace constructor_trial
{
    class ClassA
    {
        public string TextString = "フィールド定義での初期値"; // フィールドを宣言する

        public ClassA (string inputText) // コンストラクターを宣言する
        {
            // コンストラクターでは何もせず
        }
    }
}

出力は下図の様になります。クラスのフィールド宣言部分で設定した値が出力されましたね。 160121-2-01 では、コンストラクターでこのフィールドの値を設定してみます。クラスClassAのコードだけ、下記のように変更しました。

namespace constructor_trial
{
    class ClassA
    {
        public string TextString = "フィールド定義での初期値"; // フィールドを宣言する

        public ClassA (string inputText) // コンストラクターを宣言する
        {
            TextString = inputText; // フィールドに引数の文字列を設定する
        }
    }
}

出力は下図の様になります。インスタンスのフィールドの値は、コンストラクターで設定した値になりました。 160121-2-02

まとめ

フィールドの初期値は、宣言部に初期値の指定があればそれが初期値となり、もしコンストラクターにフィールドへの代入文があればそれが適用されます。宣言するときにフィールドのデフォルト値を設定しておいて、必要に応じてインスタンス生成時に初期値を設定することができるように使えそうです。

公開日

広告