为什么没有静态析构函数?

4

在我的生产代码中,我尽量避免使用静态类,因为它们无法注入,没有对默认初始化的控制,最后你不能隐式地清理资源,因为静态对象没有析构函数。此外,你也不能为静态类实现IDisposable接口,所以似乎静态类永远不适合作为包装非托管资源的方式...

看起来单例模式是直接替代静态类的更好解决方案。但我的问题是 - 为什么编译器不支持静态销毁呢?毕竟,GC跟踪静态对象和实例的引用有什么区别呢?

2个回答

7

“静态对象”并不存在。但是在任何应用程序域中加载的所有类型的静态变量都被视为垃圾收集根,直到卸载应用程序域。

如果您想在应用程序域卸载时执行操作,可以订阅AppDomain.DomainUnloadAppDomain.ProcessExit事件。


谢谢,我想我的问题是,既然静态类是用于包装某些资源(文件处理程序、pInvoke等)的便捷途径,那么清理这些资源的最佳方法是什么? - dexter
2
@Max:老实说,我通常也不会以那种方式封装资源。特别是文件句柄,最好尽快处理掉。 - Jon Skeet
好的,我认为在静态和单例之间,我的观点已经得到了专业人士的验证。 - dexter
@dnkulkarni:没有这样的术语,那么单例模式怎么可能是其中之一呢?你可以描述当你使用“静态对象”这个术语时你所指的意思,但它不是官方术语。 - Jon Skeet
@dnkulkarni:不,mcl是一个静态字段。它不是一个对象。区分这两者非常重要。 - Jon Skeet
显示剩余2条评论

2
如果你想要一个静态析构函数,那么 AppDomain.DomainUnload 事件是否可行?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接