静态析构函数

时间:2010-12-06 08:59:21

标签: c# .net

c#具有静态构造函数,可以进行一些初始化。 (可能做一些非托管资源初始化)我想知道是否有静态destuctor?

6 个答案:

答案 0 :(得分:92)

不完全是析构函数,但是你可以这样做:

class StaticClass 
{
   static StaticClass() {
       AppDomain.CurrentDomain.ProcessExit +=
           StaticClass_Dtor;
   }

   static void StaticClass_Dtor(object sender, EventArgs e) {
        // clean it up
   }
}

答案 1 :(得分:59)

这是最好的方式(参考:https://stackoverflow.com/a/256278/372666

public static class Foo
{
    private static readonly Destructor Finalise = new Destructor();

    static Foo()
    {
        // One time only constructor.
    }

    private sealed class Destructor
    {
        ~Destructor()
        {
            // One time only destructor.
        }
    }
}

答案 2 :(得分:34)

不,没有。

一个静态析构函数应该在进程执行结束时运行。当进程终止时,与其关联的所有内存/句柄都将被操作系统释放。

如果你的程序应该在执行结束时执行特定的操作(比如事务数据库引擎,刷新它的缓存),那么正确处理它将比在一个结束时运行的代码要困难得多。正常执行流程。您必须手动处理崩溃和意外终止进程,并尝试在下次运行时恢复。 “静态析构函数”概念无济于事。

答案 3 :(得分:13)

不,没有。您可以做的最接近的事情是设置一个事件处理程序 到DomainUnload上的AppDomain事件并在那里进行清理。

答案 4 :(得分:6)

从静态实现初始化和清理非托管资源非常有问题,容易出问题。

为什么不使用单例,并为实例实现Finalizer(理想情况下继承自SafeHandle

答案 5 :(得分:1)

没有像静态类的析构函数,但如果你真的需要做某事,你可以使用Appdomain.Unloaded事件