こんにちは、リバティエンジニア[?]のFUNAです。 現役エンジニアとしてアプリケーション開発やWeb制作、SEOやブログ運営をしています。
今回は、C#におけるコンストラクタとデストラクタの役割や使い方の説明をしていきます。
c# コンストラクタとは?
コンストラクタとは一言でいうと、
クラスのインスタンスが生成されたときに実行される初期化処理のようなものてす。
c#では
class testClass = new class();
とすることで指定したクラスのインスタンスを作ります。
このインスタンスが作られたときに、コンストラクタに記述された処理が実行されることになります。
コンストラクターは以下のように、クラス名と同じ名前のメソッドを書くことで定義できます。
class SampleClass
{
// コンストラクター
SampleClass()
{
// インスタンスの初期化用のコードを書く
}
}
通常のメソッドと違うところは、戻り値の型を書くことはしません。
(※というか、コンストラクターは戻り値を返すことは出来ません)
c# デストラクタとは?
デストラクターは、オブジェクトが「ガベージコレクション」に回収されるときに呼び出される特別なメソッドとなります。
基本的には確保したリソースの後片付けはDisposeメソッドやusingステートメントを使って行うのですが、usingステートメントは呼び忘れる可能性が0ではなく、100%後片付けできるとは限りません。
ですが、「ガベージコレクション」によって回収されるタイミングだと"呼び忘れ"がなくなります。
そのため、確実に解放しなければならないリソースは、Disposeメソッドだけでなく「デストラクター」でも後片付けを行うといいです。
実装サンプルコードをご紹介します。
class SampleClass
{
// コンストラクター
SampleClass()
{
// インスタンス初期化用のコードを書く
}
// デストラクター
~SampleClass()
{
// インスタンス破棄用のコードを書く
}
}
このようにコンストラクタで初期化してデストラクタでインスタンスを破棄する。
これだけはとりあえず覚えておいてください。
デストラクタの注意点としては、コンストラクタと違い自分で呼び出すようなものではないので、引数を持たせることはできません。
※注意※ デストラクターの呼び出しタイミング
.NET Frameworkでは、インスタンスの寿命は.NET自体が管理しているため、いつインスタンスの破棄が行われるのかが分かりません。
using System;
class Test
{
public Test()
{
Console.Write("Test クラスのコンストラクターが呼ばれたn");
}
~Test()
{
Console.Write("Test クラスのデストラクターが呼ばれたn");
}
}
class DestructorTest
{
static void Main()
{
Console.Write("1n");
// ここでTestのコンストラクターが呼ばれる
Test t = new Test();
Console.Write("2n");
// 上記で作成したインスタンスはもう利用されない
t = null;
// ※デストラクターはまだ呼ばれない
Console.Write("3n");
}
}
実行結果 :
1
Test クラスのコンストラクターが呼ばれた
2
3
Test クラスのデストラクターが呼ばれた
このように、デストラクターはプログラムの終了時(ガベージコレクションが動くタイミング)に呼び出されます。
ガベージコレクションのタイミングを制御することは基本的にできないのでデストラクターはいつ呼び出されるかわかりません。
上記のことを念頭において注意してさえいれば便利に使うことができるので是非活用してみてください。
C#は他にも記事を書いているのでよければ色々見ていってください。
C# コントロールのイベントを一時的に無効化する方法
[C#] Windows.Formsのイベントが発生する順番は?
【結論】未経験でプログラミングの独学はぜんぜん可能
【C#】例外処理でアプリケーションを安全に(try-catch-finally)