2012/09/06

C# で static class のファイナライザを書く

C# だと static class にはファイナライザを用意できない。

シングルトンを使え、という方針は正しいが、
それでも static class のファイナライザが実装したいときはある。

private 定義のクラスのインスタンスに肩代わりしてもらう方法を考えてみた。
public static class FinalizableStaticClass
{
    private class FinalizeWorkClass
    {
        ~FinalizeWorkClass()
        {
            // ファイナライザ
        }
    }
    private static FinalizeWorkClass finalizeWorkClass = new FinalizeWorkClass();
}

  • FinalizableStaticClass に一度もアクセスしなければ、FinalizeWorkClass のインスタンスは生成されないので、当然ファイナライザも呼ばれない。
  • ファイナライザが呼び出されるタイミングは、通常のフォームアプリケーションだと Main が終了した後。確かめていないけど、多分アプリケーションドメインが終わった時。
  • ファイナライザではアンマネージリソースの後片付けとかぐらいにしておくこと。
Delphi の initialization/finalization が C# にもあればなあ。