我很想知道为什么C#中不允许使用静态析构函数。请注意,我不认为它们以任何其他语言存在。
我可以有一个这样的课。
class A
{
static A()
{
// here I can load a resource that will be avaliable for all instances
// of this class.
}
}
当应用程序结束时,我可能需要释放资源。
因此,静态析构函数的语义可能如下:在应用程序结束时调用,包含它并在应用程序中初始化的类。
答案 0 :(得分:4)
你的语义是一种可能的语义,但我想你还没有检查它对语言的所有影响。在我所知道的大多数(或多或少)动态语言中,破坏是一个看起来更复杂的主题。为什么不在不再引用类时调用析构函数?或者如果卸载组件?应该以什么顺序调用析构函数? ...?
如果您只想在应用程序结束时执行某些代码,请查看.Net文档。有更简单,更可靠的方法。
答案 1 :(得分:4)
因此,静态析构函数的语义可能如下: - be 在应用程序结束时调用,在包含它的类上调用 在应用中收费。
您的语义依赖于您的程序在执行结束时执行特定操作,这比正常执行过程结束时运行的一段代码更难以正确处理。
考虑事务或文件管理操作。您必须手动处理崩溃和进程的意外终止,并尝试在下次运行时进行恢复,因此使用静态析构函数无助于此。 .NET管理世界倾向于using模式而不是那种模式。现在,如果您遇到严重问题,请尝试将事件处理程序附加到DomainUnloaded
上的AppDomain
事件并在那里执行清理。
您也可以尝试使用 singleton 处置方式:
class A : IDisposable
{
public static A Instance {get; private set;}
public static A()
{
Instance=new A();
}
public void MethodA() {...}
public void Dispose()
{
//...
}
~A()
{
// Release your hard resources here
}
}
然后,使用安全方法:
A.Instance.MethodA();