コンストラクターの使用 (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# プログラミング ガイド)」を参照してください。

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

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

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

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

詳細については、「プライベート コンストラクター (C# プログラミング ガイド)」を参照してください。

struct 型のコンストラクターはクラス コンストラクターに似ていますが、struct には、既定のコンストラクターがコンパイラによって自動的に提供されるため、明示的な既定のコンストラクターを含めることができません。このコンストラクターは、struct 内の各フィールドを既定値に初期化します。詳細については、「既定値の一覧表 (C# リファレンス)」を参照してください。ただし、この既定のコンストラクターは、struct が new によってインスタンス化される場合にのみ呼び出されます。たとえば、次のコードでは、Int32 の既定のコンストラクターが使用されるため、確実に整数を初期化できます。

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

しかし、次のコードでは、new を使用せず、初期化されていないオブジェクトを使用するため、コンパイラ エラーになります。

int i;
Console.WriteLine(i);

これに対して、struct に基づくオブジェクト (組み込みのすべての数値型を含む) は、次の例のように、初期化または代入してから使用することができます。

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

そのため、値型の既定のコンストラクターを呼び出す必要がありません。

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

public class Employee
{
    public int salary;

    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 (C# リファレンス)」を参照してください。

派生クラスでは、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;
}

コンストラクターは、publicprivateprotectedinternal、または protectedinternal とマークできます。これらのアクセス修飾子により、クラスのユーザーがクラスを作成する方法が定義されます。詳細については、「アクセス修飾子 (C# プログラミング ガイド)」を参照してください。

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

C# 言語仕様

詳細については、「C# 言語仕様」を参照してください。言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。

参照

関連項目

クラスと構造体 (C# プログラミング ガイド)

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

デストラクター (C# プログラミング ガイド)

概念

C# プログラミング ガイド