C#有静态构造函数,用于进行一些初始化操作(比如进行一些非托管资源的初始化)。
我想知道是否有静态析构函数?
虽然不是真正的析构函数,但以下是实现方式:
class StaticClass
{
static StaticClass() {
AppDomain.CurrentDomain.ProcessExit +=
StaticClass_Dtor;
}
static void StaticClass_Dtor(object sender, EventArgs e) {
// clean it up
}
}
这是最好的方法(参考:https://dev59.com/xnVC5IYBdhLWcg3wjx1d#256278)
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.
}
}
}
Finalise
吗,还是当 Foo
被销毁时它会自动被调用? - anatol不,没有。
静态析构函数据说会在进程执行结束时运行。当一个进程终止时,所有与其关联的内存/句柄都将被操作系统释放。
如果你的程序在执行结束时应该执行特定操作(例如事务性数据库引擎刷新其缓存),那么正确处理它比只运行在进程正常执行结束时的代码要困难得多。您必须手动处理进程崩溃和意外终止,并尝试在下次运行时恢复。 "静态析构函数" 的概念并不能帮助解决这个问题。
没有,你能做的最接近的方法是在 AppDomain
上设置一个时间处理程序,将其设置为 DomainUnload
事件,并在那里执行清理。
在静态实现中初始化和清理非托管资源是相当棘手的,容易出现问题。
为什么不使用单例,并为该实例实现一个Finalizer
(最好继承自SafeHandle
)呢?
Appdomain.Unloaded
事件。