为什么不在C#中使用静态析构函数

时间:2012-10-03 13:13:41

标签: c#

我很想知道为什么C#中不允许使用静态析构函数。请注意,我不认为它们以任何其他语言存在。

我可以有一个这样的课。

 class A
 {
      static A()
      {
         // here I can load a resource that will be avaliable for all instances 
         // of this class.
      }
 }

当应用程序结束时,我可能需要释放资源。

因此,静态析构函数的语义可能如下:在应用程序结束时调用,包含它并在应用程序中初始化的类。

2 个答案:

答案 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();