[英]Why can't static classes have destructors?
分为两部分:
如果静态类可以具有静态构造函数,为什么它不能具有静态析构函数?
最好的解决方法是什么? 我有一个静态类来管理作为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();
(注意如何在静态构造函数中创建实例,该静态构造函数是在首次引用任何类静态成员时调用的)
静态类没有析构函数,因为静态类永远不会被破坏。
如果要创建和销毁它的多个实例,则它不应是静态的。 使它成为一堂完整的课。
无论如何,析构函数都不应该用于此目的。 使用IDisposable /处置。
1.为什么? -类型本身不能具有构造函数,就像您通常在实例上如何看待构造函数一样。 通常,它有时被称为“静态初始值设定项”方法,但是Microsoft使用术语“类型构造函数”(并且有特殊限制)-您将代码放入其中以初始化类型/类-如果它是实例构造函数,则可能是超载。 对“类型构造函数”的静态限制是因为.NET CLR负责将类模板加载到堆上,并且不允许在这种情况下指定参数(因为您将如何传递参数)。 因为从最严格的意义上讲,程序员不负责导致类型构造函数被调用,所以当它在CLR领域中时,允许程序员编写静态析构函数就没有多大意义。 CLR最终会从堆中删除类模板,但是类模板的生存期比其实例更长,因此无论如何您都不希望在其中进行任何资源密集型工作(例如,保持打开数据库连接)。
2.什么? -Singleton如果您遇到需要在类模板上打开资源并随后销毁它的情况,则可以考虑Singleton软件模式仅具有该类的一个实例,并且可能还实现System.IDiposable接口,除了析构函数外,还有助于清理。 (我看到有人首先将我击败了IDisposable代码示例,所以在这里结束我的解决方案。)
静态类永远不会被破坏。 它与程序一起终止。 您可以使用单例模式作为实现,而不是使用静态类
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.