Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么不在C中使用静态析构函数#_C# - Fatal编程技术网

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

C# 为什么不在C中使用静态析构函数#,c#,C#,我很想知道为什么C#中不允许使用静态析构函数。请注意,我并不认为它们存在于任何其他语言中 我可以上这样的课 class A { static A() { // here I can load a resource that will be avaliable for all instances // of this class. } } 当应用程序结束时,我可能需要释放资源 因此,静态析构函数的语义可以如下所示:当

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

我可以上这样的课

 class A
 {
      static A()
      {
         // here I can load a resource that will be avaliable for all instances 
         // of this class.
      }
 }
当应用程序结束时,我可能需要释放资源


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

您的语义是一种可能的语义,但我猜您尚未检查它对语言的所有影响。在我所知道的大多数(或多或少)动态语言中,销毁是一个看起来要复杂得多的主题。当类不再被引用时,为什么不调用析构函数呢?或者是否卸载了程序集?析构函数应该按什么顺序调用

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

因此,静态析构函数的语义可以如下:-be 在应用程序结束时,在包含该应用程序且 在应用程序中充电

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

考虑事务或文件管理操作。您必须手动处理崩溃和进程的意外终止,并在下次运行时尝试恢复,所以使用静态析构函数不会有多大帮助。网络管理世界偏爱模式而不是模式。现在,如果您在这方面遇到严重问题,请尝试将事件处理程序附加到
AppDomain
上的
domainunload
事件,并在那里执行清理

您还可以尝试一下单件处理方式:

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

使用Singleton模式并实现IDisposable接口可以实现此行为。如果应用程序结束-其使用的资源是否会释放?@YavgenyP 1)
AppDomain
unload和进程终止不一样2)进程终止时,并非每个资源都会释放3)有时在这种情况下,您需要实际的代码,例如确保写入队列中的数据。将该资源作为类的静态属性保留。Legoless,Singleton给了我们许多其他限制。可能是我不想在应用程序结束时只执行一些代码,可能是我想让一个类负责释放一些静态资源。正如我在回答中试图解释的那样:似乎您只考虑了一个用例,但要求提供通用编程语言的一般特性。“释放一些静态资源”是什么意思?假设有两个类拥有这样的资源,并且它们相互依赖。语言应该如何解决这个问题?只是一个提示:我为什么要猜你想做什么?只要告诉我们您的真正目的,我们就会尽力帮助您解决问题。;-)阿希姆,我同意你说的所有语义都是可用的。当我试图解决这个问题时,我想到了这个问题:首先,我不同意你给我看的类不是单例类,因为它有一个默认的公共构造函数,并且终结器将在这个类的每个实例上执行。是的,我们可以用私有构造函数解决这个问题,但这会引入其他限制,例如继承。