この章のテーマ §
コンストラクタとファイナライザとデストラクタについて学びます。オブジェクトの生成と破棄の通知を受け取ることができます。
前提知識 §
Console.WriteLineメソッド, 文字列の基礎, 変数の基礎, メソッドの基礎, new演算子
解説 §
コンストラクタはオブジェクトが作成された時に呼び出される機能です。オブジェクトの初期化コードを書くことができます。
コンストラクタはメソッドに似ていますが、戻り値の型がありません。new演算子から間接的に呼び出されて結果を返す方法が無いからです。しかし、引数はあります。new演算子の引数がそのまま渡されます。
ファイナライザはオブジェクトの消滅を通知します。しかし、滅多に使用されません。オブジェクトはガベージコレクタで回収されますが、ガベージコレクタがいつ動作するか分からない上に、必ず回収が実行されるという保証もありません。サンプルソースでは、ファイナライザが実行されなかったことを確認してみて下さい。
デストラクタはファイナライザの旧名です。
罠の数々 §
- コンストラクタは必ず呼ばれると考えて良い。ただし、構造体の場合は呼ばれないこともある
- ファイナライザを使うよりも、IDusposableインターフェースとusing文を使って確実な終了処理を行う方がお勧めである。いつ終了処理が走るのかが明確だからである
参考リンク §
コンストラクター (C# プログラミング ガイド)
ファイナライザー (C# プログラミング ガイド)
サンプルソース: Constructor §
var a = new MySample("サンプル実行");
class MySample
{
public MySample(string message)
{
Console.WriteLine($"MySampleは生成されます。:{message}");
}
~MySample()
{
Console.WriteLine("MySampleは破棄されます。");
}
}
実行結果 §
MySampleは生成されます。:サンプル実行
リポジトリ §
https://github.com/autumn009/CSharpPrimer2
練習問題 §
以下のプログラムの実行結果を予測してみよう。
var a = new X(2);
Console.WriteLine(a.A);
class X
{
public int A { get; set; } = 3;
public X()
{
A = 1;
}
public X(int x)
{
A = x;
}
}
- 1
- 2
- 3
- コンパイルエラー
- 実行時例外
[[解答]]