2

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

我可以上一堂这样的课。

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

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

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

4

2 回答 2

4

您的语义是一种可能的语义,但我想您还没有检查它对语言的所有影响。在我所知道的大多数(或多或少)动态语言中,破坏是一个看起来要复杂得多的话题。当不再引用该类时,为什么不调用析构函数?或者如果程序集被卸载?应该以什么顺序调用析构函数?...?

如果您只想在应用程序结束时执行一些代码,请查看 .Net 文档。有更简单、更可靠的方法可以做到这一点。

于 2012-10-03T13:17:44.453 回答
4

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

您的语义依赖于您的程序在执行结束时执行特定操作,这比仅在进程正常执行结束时运行的一段代码更难正确处理。

考虑事务或文件管理操作。您必须手动处理进程的崩溃和意外终止,并尝试在下次运行时恢复,因此使用静态析构函数不会有太大帮助。.NET 托管世界倾向于使用模式而不是那种模式。现在,如果您对此有严重问题,请尝试将事件处理程序附加到DomainUnloaded事件上AppDomain并在那里执行清理。

您还可以尝试使用单例处理方式:

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();
于 2012-10-03T13:23:23.450 回答