静态析构函数

use*_*949 66 .net c#

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

zac*_*fix 99

不完全是析构函数,但这是你将如何做到这一点:

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

   static void StaticClass_Dtor(object sender, EventArgs e) {
        // clean it up
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 尽管事件_似乎_发生在 AppDomain 上,但实际上只有在默认域退出(即最后一个域)时才会触发,就在整个应用程序死亡之前。当卸载任何其他 AppDomain 时,它_不会触发_,这本身会导致大多数类型和类型的实例被破坏(但并非总是如此)。此事件不是[保证总是触发。](http://blogs.msdn.com/b/jmstall/archive/2006/11/26/process-exit-event.aspx)。 (2认同)

Tod*_*son 62

这是最好的方法(参考: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.
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,这*不*保证有效。根据 Raymond Chen 关于 [垃圾收集](https://blogs.msdn.microsoft.com/oldnewthing/20100809-00/?p=13203/) 的文章,终结器并不可靠,因为无法保证 GC 将永远运行。 (7认同)
  • 这种方式保证有效!:)试一试,我有单元测试,证明如果有人有兴趣它可以工作吗? (3认同)
  • @TodThomson 对于 .NET Framework,~Object [备注](https://learn.microsoft.com/en-us/dotnet/api/system.object.finalize?view=netframework-4.8#remarks) 部分列出了一些情况,其中无法保证终结器,并且您链接的文档指出,在 .NET Core 下关闭时不会调用它们。不幸的是,MS 文档的质量已不如以前。 (2认同)

Meh*_*ari 36

不,没有.

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

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

  • 就我而言,我使用的是需要发布的操作系统范围的互斥锁,否则会在下次运行应用程序时抛出AbandonedMutexException.在这种情况下,程序结束时释放的内存和句柄不会占用我的Mutex.你在第3段中所说的可能是一种管理它的方法,但是应用程序发布的结束对我来说似乎更有意义. (5认同)

Nei*_*ght 16

不,没有.你可以做的最接近的事设置了事件处理程序的DomainUnload事件上AppDomain,有执行的清理.

  • 对于更高层次的"Process_Exit"建议,这实际上是一种更受欢迎的方法,这是非常不同的.静态ctor触发后的类型的生命周期通常是程序集的生命周期,它将通过AppDomain卸载. (4认同)

Dea*_*alk 6

从Static实现初始化和清理非托管资源是非常有问题的并且容易出现问题.

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