コンストラクターの使用 (C# プログラミング ガイド)

クラスまたは構造体のインスタンスを作成する際には、そのコンストラクターが呼び出されます。 コンストラクターの名前はクラスまたは構造体と同じで、通常は、このコンストラクターによって、新しいオブジェクトのデータ メンバーが初期化されます。

次の例では、Taxi というクラスが、簡単なコンストラクターを使用して定義された後、 new 演算子によってインスタンス化されます。 Taxi コンストラクターは、新しいオブジェクトに対してメモリが割り当てられるとすぐに、new 演算子によって呼び出されます。

public class Taxi
{
    public bool IsInitialized;

    public Taxi()
    {
        IsInitialized = true;
    }
}

class TestTaxi
{
    static void Main()
    {
        Taxi t = new Taxi();
        Console.WriteLine(t.IsInitialized);
    }
}

パラメーターを取らないコンストラクターを "パラメーターなしのコンストラクター" と呼びます。 new 演算子を使ってオブジェクトをインスタンス化する際に new に引数を渡さなかった場合、常にパラメーターなしのコンストラクターが呼び出されます。 C# 12 では、"プライマリ コンストラクター" が導入されました。 プライマリ コンストラクターでは、新しいオブジェクトを初期化するために指定する必要があるパラメーターを指定します。 詳細については、「インスタンス コンストラクター」を参照してください。

クラスが静的である場合を除き、コンストラクターが存在しないクラスには、クラスをインスタンス化できるように、パブリックなパラメーターなしのコンストラクターが C# コンパイラによって割り当てられます。 詳細については、「静的クラスと静的クラス メンバー」を参照してください。

次のようにコンストラクターをプライベートにすれば、クラスがインスタンス化されないようにできます。

class NLog
{
    // Private Constructor:
    private NLog() { }

    public static double e = Math.E;  //2.71828...
}

詳細については、「プライベート コンストラクター」を参照してください。

struct 型のコンストラクターはクラス コンストラクターに似ています。 new を使って struct 型のインスタンスを作成すると、コンストラクターが呼び出されます。 struct をその default 値に設定すると、ランタイムにより、構造体内のすべてのメモリは 0 に初期化されます。 C# 10 より前のバージョンでは、コンパイラによって自動的に指定されるため、structs に明示的なパラメーターなしのコンストラクターを含めることはできません。 詳細については、「構造体型」の記事の構造体の初期化と既定値に関するセクションを参照してください。

次のコードでは、Int32 のパラメーターなしのコンストラクターが使われるため、整数が確実に初期化されます。

int i = new int();
Console.WriteLine(i);

ただし、次のコードでは new が使用されておらず、コードは初期化されていないオブジェクトの使用を試みるため、コンパイラ エラーが発生します。

int i;
Console.WriteLine(i);

これに対して、structs をベースにしたオブジェクト (組み込みのすべての数値型など) は、次の例のように、初期化または代入してから使用できます。

int a = 44;  // Initialize the value type...
int b;
b = 33;      // Or assign it before using it.
Console.WriteLine("{0}, {1}", a, b);

クラスと構造体のいずれでも、プライマリ コンストラクターなどのパラメーターを受け取るコンストラクターを定義できます。 パラメーターを受け取るコンストラクターは、new ステートメントまたは base ステートメントを使用して呼び出す必要があります。 クラスと構造体は複数のコンストラクターを定義することもできます。また、どちらも、パラメーターなしのコンストラクターの定義には必要ありません。 次に例を示します。

public class Employee
{
    public int Salary;

    public Employee() { }

    public Employee(int annualSalary)
    {
        Salary = annualSalary;
    }

    public Employee(int weeklySalary, int numberOfWeeks)
    {
        Salary = weeklySalary * numberOfWeeks;
    }
}

このクラスは、次のいずれかのステートメントを使用して作成できます。

Employee e1 = new Employee(30000);
Employee e2 = new Employee(500, 52);

コンストラクターでは、base キーワードを使用して、基底クラスのコンストラクターを呼び出すことができます。 次に例を示します。

public class Manager : Employee
{
    public Manager(int annualSalary)
        : base(annualSalary)
    {
        //Add further instructions here.
    }
}

この例では、コンストラクターのブロックを実行する前に、基底クラスのコンストラクターを呼び出しています。 base キーワードは、パラメーターの有無に関係なく使用できます。 コンストラクターのパラメーターは、base のパラメーターまたは式の一部として使用できます。 詳細については、「base」を参照してください。

派生クラスで基底クラスのコンストラクターが base キーワードを使用して明示的に呼び出されていない場合、パラメーターなしのコンストラクター (存在する場合) は暗黙的に呼び出されます。 次のコンストラクターの宣言は実質的に同じです。

public Manager(int initialData)
{
    //Add further instructions here.
}
public Manager(int initialData)
    : base()
{
    //Add further instructions here.
}

基底クラスがパラメーターなしのコンストラクターを提供しない場合、派生クラスでは、base を使って基本コンストラクターを明示的に呼び出す必要があります。

コンストラクターで this キーワードを使用すると、同じオブジェクトで別のコンストラクターを呼び出すことができます。 base と同様、this もパラメーターの有無に関係なく使用でき、コンストラクターのパラメーターはいずれも this のパラメーターとしても、式の一部としても使用できます。 たとえば、上の例の 2 番目のコンストラクターは this を使用して次のように書き直すことができます。

public Employee(int weeklySalary, int numberOfWeeks)
    : this(weeklySalary * numberOfWeeks)
{
}

上の例で this キーワードを使用すると、このコンストラクターが呼び出されます。

public Employee(int annualSalary)
{
    Salary = annualSalary;
}

コンストラクターは、publicprivateprotectedinternalprotected internal または private protected としてマークできます。 こうしたアクセス修飾子により、クラスのユーザーによるクラスの作成方法が定義されます。 詳細については、「アクセス修飾子」を参照してください。

コンストラクターは、static キーワードを使用して静的として宣言できます。 静的コンストラクターは、静的フィールドがアクセスされる直前に自動的に呼び出され、静的なクラス メンバーを初期化するために使われます。 詳細については、「静的コンストラクター」を参照してください。

C# 言語仕様

詳細については、「C# 言語仕様」のインスタンス コンストラクター静的コンストラクターに関するセクションを参照してください。 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。

関連項目