c#具有静态构造函数,可以进行一些初始化。 (可能做一些非托管资源初始化)我想知道是否有静态destuctor?
答案 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
事件