オブジェクトは生まれて消えます。
生まれるタイミングはすぐ分かります。
new演算子を書けばそこが産まれるタイミングだし、コンストラクタなら確実にそのタイミングで実行されるコードを書けます。
では、消えるタイミングはどうでしょうか。
ファイナライザーというものがあり、C#ではデストラクターと呼ばれる構文でそれを書くことができます。
しかし、これの利用はお勧めではありません。
いつ呼び出されるか分からないし、場合によっては呼び出されないからです。
サンプルソースでは呼び出されていません。
現実的には、IDisposableを実装してusing文と併用するのがお勧めです。こうすると、使い終わった時点でDisposeメソッドが呼ばれます。
罠の数々 §
- デストラクターは確実に呼び出されない。しかし、using文を忘れたDisposeメソッドもはやり呼び出されない。C#とは確実を求めないことで性能向上や使い勝手の改善を行うプログラミング言語であることに留意しよう。
参考リンク §
ファイナライザー (C# プログラミング ガイド)
GC.Collect メソッド
IDisposable インターフェイス
ファイナライザーとデストラクターの用語は混乱している。上記のファイナライザーのURLはdestructorsとなっている。上記のページはマイクロソフト公式だがファイナライザー(デストラクターとも呼ばれる)とまで話がまるまっていることを確認してみよう。
また上記のリンクを辿って、GC.Collect メソッドを呼び出しても全てのオブジェクトが確実に回収されない理由を考えてみよう。
リポジトリ §
https://github.com/autumn009/cshowto
Fnalizer §
using System;
class Sample : IDisposable
{
public Sample()
{
Console.WriteLine("私、産まれました!");
}
~Sample()
{
Console.WriteLine("私、消えます!");
}
public void Dispose()
{
Console.WriteLine("私、Disposeされました!");
}
}
class Program
{
static void Main()
{
// ファイナライザー?
var a = new Sample();
Console.WriteLine($"a of {a} is here!");
a = null;
GC.Collect();
// IDisposable インターフェース?
using var b = new Sample();
Console.WriteLine($"b of {b} is here!");
}
}
実行結果
私、産まれました!
a of Sample is here!
私、産まれました!
b of Sample is here!
私、Disposeされました!