次の方法で共有


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

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

次の例では、Taxi という名前のクラスを単純なコンストラクターを使用して定義します。 このクラスは、新しい 演算子 使用してインスタンス化されます。 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...
}

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

構造体 型のコンストラクターは、クラス コンストラクターに似ています。 newを使用して構造体型がインスタンス化されると、コンストラクターが呼び出されます。 struct がその default 値に設定されると、ランタイムは構造体内のすべてのメモリを 0 に初期化します。 struct 型でフィールド初期化子を宣言する場合は、パラメーターなしのコンストラクターを指定する必要があります。 詳細については、「構造体型」の記事の構造体の初期化と既定値に関するセクションを参照してください。

次のコードでは、整数が初期化されていることを確認できるように、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 ステートメントまたは 基本 ステートメントを介して呼び出す必要があります。 クラスと構造体は複数のコンストラクターを定義することもできます。パラメーターなしのコンストラクターを定義する必要はありません。 例えば:

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 キーワードを使用して明示的に呼び出されない場合、パラメーターなしのコンストラクター (存在する場合) は暗黙的に呼び出されます。 次のコンストラクター宣言は実質的に同じです。

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

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

コンストラクターは、この キーワード を使用して、同じオブジェクト内の別のコンストラクターを呼び出すことができます。 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# の構文と使用法の決定的なソースです。

関連項目