クラスの初期化で使うコンストラクタを定義する | Visual C# プログラミング

SPECIAL


クラスの初期化で使うコンストラクタを定義する

C# でクラスを定義するとき、そのクラスを構築するときに呼び出す「コンストラクタ」を定義する必要があります。

コンストラクタはクラスと同じ名前のメソッドのように定義しますが、戻り値はないため、戻り値の型は記載しません。

public class MyClass

{

// コンストラクタを定義します。

public MyClass()

{

this.Name = "MyClass";

this.Description = "Default Description";

}

 

// このクラスに "Name" というプロパティと "Description" というプロパティを定義しています。

public string Name { get; set; }

public string Description { get; set; }

}

こうして定義したクラスは、次のようにしてクラスのインスタンスを生成すると、その時にコンストラクタが実行されて、クラスの初期化が行われます。

var obj = new MyClass();

引数をとるコンストラクタを定義する

初期化の際に引数を受け取るコンストラクタを定義することもできます。

たとえば "Description" プロパティの値を初期化時に自由に指定できるようにしたい場合は、コンストラクタを次のように定義します。

public class MyClass

{

// 引数をとるコンストラクタを定義します。

public MyClass(string description)

{

this.Name = "MyClass";

this.Description = description;

}

 

// このクラスに "Name" というプロパティと "Description" というプロパティを定義しています。

public string Name { get; set; }

public string Description { get; set; }

}

こうすることで、次のようにクラスをインスタンス化できるようになります。

var obj = new MyClass("My Description");

複数のコンストラクタを定義する

異なる引数を取るコンストラクタであれば、複数のコンストラクタを定義することができます。

たとえば、引数に文字列を 1 つ受け取って "Description" プロパティを設定できるコンストラクタと合わせて、引数を何も受け取らずに "Description" プロパティに既定値を設定するコンストラクタを定義できます。効率が少し悪い書き方ですが、たとえば次のようになります。

public class MyClass

{

// 引数をとらないコンストラクタを定義します。

public MyClass()

{

this.Name = "MyClass";

this.Description = "Default Description";

}

 

// 引数をとるコンストラクタを定義します。

public MyClass(string description)

{

this.Name = "MyClass";

this.Description = description;

}

 

// このクラスに "Name" というプロパティと "Description" というプロパティを定義しています。

public string Name { get; set; }

public string Description { get; set; }

}

このとき、上の例では "Name" プロパティの既定値を設定するコードが両方のコンストラクタに記載されていますが、このような重複を回避することもできます。

共通で使えるコンストラクタを実装したら、別のコンストラクタからそれを呼び出すことで、不必要に重複のないコードにできます。あるコンストラクタから自身の別のコンストラクタを呼び出すには、次のように、コンストラクタの定義のすぐ横に ": this()" という形で、コンストラクタの呼び出しを明記します。

public class MyClass

{

// 引数をとらないコンストラクタを定義します。

public MyClass() : this("Default Description")

{

}

 

// 引数をとるコンストラクタを定義します。

public MyClass(string description)

{

this.Name = "MyClass";

this.Description = description;

}

 

// このクラスに "Name" というプロパティと "Description" というプロパティを定義しています。

public string Name { get; set; }

public string Description { get; set; }

}

上記の例では、引数をとらないコンストラクタで ":this(string)" というようなコードを記載しています。

このようにすることで、引数をとらないコンストラクタが呼び出されたときに、まず "this" の右側に書かれた引数に該当するコンストラクタを実行した後で、もともとの呼び出されたコンストラクタ内に実装されたコードが実行されます。


[ もどる ]