.net column
.NET開発者のためのブログメディア

C#のコンストラクタを基本から解説!|様々なコンストラクタを使いこなそう

公開日時:   更新日時:
C#のコンストラクタを基本から解説!|様々なコンストラクタを使いこなそう
基本情報技術者試験の試験対策はこちら>>
SE
C#のコンストラクタにはどのような種類や機能があるのですか。
PM
コンストラクタはクラスの基本です。コンストラクタについて詳しくご紹介しましょう。

C#のコンストラクタとは?


C#のクラスを使う上で、コンストラクタは欠かせません。コンストラクタとはクラスがnewでインスタンスとして生成された時に、初期化を行うためのメソッドです。

以下のようなクラス名と同名のメソッドがコンストラクタです。

class TestClass
{
private int value;
public TestClass() // コンストラクタ
{
// ここで初期化を行う
value = 0;
}
}

コンストラクタには普通のメソッドのようなvoidやintといった戻り値の型は不要です。コンストラクタは値を返さないからです。

コンストラクタはnewした時に呼ばれる

コンストラクタはnewでインスタンスを生成した時に呼ばれます。
以下のC#サンプルをご覧下さい。

using System;
class TestClass
{
public TestClass()
{
Console.WriteLine(“コンストラクタが呼ばれました。”);
}

public static void Main()
{
TestClass t = new TestClass();
}
}

実行すると以下が表示されます。newをすればコンストラクタが呼ばれます。

コンストラクタが呼ばれました。

コンストラクタにはパラメータを渡せる

コンストラクタはパラメータとして値を渡すことができます。

以下のC#サンプルをご覧ください。

class TestClass
{
private int val;
private string str;
public TestClass(int val, string str)
{
this.val = val;
this.str = str;
}
}

このようにコンストラクタで初期化する値を渡すことができます。なおthis.とはクラスのメンバを意味します。コンストラクタのパラメータとクラスのフィールド名が同じ場合は、this.を付けることで区別できます。

コンストラクタは複数持つことができる

コンストラクタは複数持つことが可能です。

以下のC#サンプルをご覧ください。

class TestClass
{
public int val;
public string str;

public TestClass()
{
val = 0;
str = “”;
}
public TestClass(int val, string str)
{
this.val = val;
this.str = str;
}
}

複数の同名コンストラクタを使い分けよう

上のC#サンプルのクラスは、以下のように呼び出すことができます。

public static void Main()
{
TestClass t1 = new TestClass();
TestClass t2 = new TestClass(3, “長嶋”);
Console.WriteLine(t1.val);
Console.WriteLine(t2.val);
}

実行結果は、

0
3

です。なおこのように同じ名前のメソッドを複数持つことをオーバーロードと言います。コンストラクタ以外のメソッドでもオーバーロードは可能です。

コンストラクタ初期化子

上のC#サンプルは、以下のように書くこともできます。

class TestClass
{
public int val;
public string str;

public TestClass() : this(0, “”)
{
}
public TestClass(int val, string str)
{
this.val = val;
this.str = str;
}
}

this(0, “”)はコンストラクタ初期化子と言います。これでパラメータ無しでnewされた時に、TestClass(int val, string str)の方のコンストラクタを呼び出して、指定のパラメータで初期化できるのです。なおコンストラクタ初期化子はコンストラクタの処理よりも先に実行されます。

ラムダ式のコンストラクタ

コンストラクタには=>のラムダ式が使用できます。

ただしラムダ式が使えるのはコンストラクタのパラメータが1つだけの場合です。代入以外の初期化処理も記述できないので、使う機会はあまりないかもしれません。

静的コンストラクタ

C#にはstaticなフィールドを初期化するための静的コンストラクタという機能があります。コンストラクタにstaticを付ければそれができます。

静的コンストラクタにもラムダ式が使える

上のC#サンプルを実行すると、以下のように表示されます。

静的メンバです。

なお静的コンストラクタも以下のようにラムダ式を使えます。普通のコンストラクタよりこちらの方が使用する機会があるかもしれません。

class TestClass
{
public static string str;

static TestClass() => str = “静的メンバです。”;
}

静的コンストラクタはパラメータを持てない、直接呼び出せない、オーバーロードできないといった制約があります。また静的コンストラクタが呼ばれるタイミングは、静的フィールドにアクセスする前であることが保障されています。

静的コンストラクタはreadonlyのフィールドの値を設定できる

静的コンストラクタは読み取り専用のstatic readonlyのフィールドに値を設定できます。

class TestClass
{
public static readonly string str;

static TestClass()
{
str = “readonly文字列”;
}
}

静的コンストラクタを使わず以下のように宣言時に初期化することもできますが、初期化処理を一か所にまとめたい場合は便利です。

public static readonly string str = “readonly文字列”;

privateなコンストラクタ

コンストラクタをpublicではなくprivateにすると、newできないようにすることが可能です。

以下のC#サンプルをご覧ください。

class TestClass
{
public string str;
private TestClass()
{
}
public TestClass(string str)
{
this.str = str;
}
}

このクラスでnew TestClass()とするとprivateのためアクセスできず、エラーになります。ただしnew TestClass(“文字列”)は可能です。必ずパラメータを指定してnewして欲しい時に有効です。

なお一切newさせたくない場合は、全てのコンストラクタをprivateにするのではなく、abstructやinterface、staticクラスを利用する方が意図が明確になって良いでしょう。

デストラクタの使用は非推奨

C#にはコンストラクタと対になるデストラクタがあります。

class TestClass
{
public TestClass()
{
}
~TestClass()
{
}
}

この~TestClass()がデストラクタです。デストラクタはnewされたクラスのインスタンスが解放された時に呼ばれます。ただし、C#が動作する.Net Frameworkは、インスタンスをいつ開放するかは明確になっていません。

そのためデストラクタはいつ呼ばれるのかが分かりません。確実性が無い機能なので使用しない方がよいでしょう。デストラクタはC++という古い言語にある機能で、C#でそれをとりあえず引きついだという背景があります。

SE
コンストラクタにはいろいろな機能があるのですね。
PM
その通りです。コンストラクタはクラスの基本ですから、しっかり理解してください。

様々なコンストラクタを使いこなそう

コンストラクタについて解説しましたが、いかがでしたでしょうか。

コンストラクタはクラスの基本ですが、知らない機能もいくつかあったのではないかと思います。是非活用して優れたC#プログラムを作ってください。


.NET分野でのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)

Search

Popular

reccomended

Categories

Tags