繁体   English   中英

为什么静态类不能具有析构函数?

[英]Why can't static classes have destructors?

分为两部分:

  1. 如果静态类可以具有静态构造函数,为什么它不能具有静态析构函数?

  2. 最好的解决方法是什么? 我有一个静态类来管理作为COM对象的连接池,并且如果程序中其他地方发生问题,我需要确保其连接被关闭/释放。

您应该使用具有单例模式的普通类(而不是静态类)(即,保留该类的单个实例,也许由类本身的一个静态属性引用)。 然后,您可以拥有一个析构函数,或者甚至可以拥有一个析构函数和Dispose方法的组合。

例如,如果您现在拥有:

static class MyClass
{
    public static void MyMethod() {...}
}

//Using the class:
MyClass.MyMethod();

您将改为:

class MyClass : IDisposable
{
    public static MyClass()
    {
        Instance=new MyClass();
    }

    public static MyClass Instance {get; private set;}

    public void MyMethod() {...}

    public void Dispose()
    {
        //...
    }

    ~MyClass()
    {
        //Your destructor goes here
    }
}

//Using the class:
MyClass.Instance.MyMethod();

(注意如何在静态构造函数中创建实例,该静态构造函数是在首次引用任何类静态成员时调用的)

  1. 静态类没有析构函数,因为静态类永远不会被破坏。

  2. 如果要创建和销毁它的多个实例,则它不应是静态的。 使它成为一堂完整的课。

  3. 无论如何,析构函数都不应该用于此目的。 使用IDisposable /处置。

1.为什么? -类型本身不能具有构造函数,就像您通常在实例上如何看待构造函数一样。 通常,它有时被称为“静态初始值设定项”方法,但是Microsoft使用术语“类型构造函数”(并且有特殊限制)-您将代码放入其中以初始化类型/类-如果它是实例构造函数,则可能是超载。 对“类型构造函数”的静态限制是因为.NET CLR负责将类模板加载到堆上,并且不允许在这种情况下指定参数(因为您将如何传递参数)。 因为从最严格的意义上讲,程序员不负责导致类型构造函数被调用,所以当它在CLR领域中时,允许程序员编写静态析构函数就没有多大意义。 CLR最终会从堆中删除类模板,但是类模板的生存期比其实例更长,因此无论如何您都不希望在其中进行任何资源密集型工作(例如,保持打开数据库连接)。

2.什么? -Singleton如果您遇到需要在类模板上打开资源并随后销毁它的情况,则可以考虑Singleton软件模式仅具有该类的一个实例,并且可能还实现System.IDiposable接口,除了析构函数外,还有助于清理。 (我看到有人首先将我击败了IDisposable代码示例,所以在这里结束我的解决方案。)

静态类永远不会被破坏。 它与程序一起终止。 您可以使用单例模式作为实现,而不是使用静态类

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM