在我的生产代码中,我尽量避免使用静态类,因为它们无法注入,没有对默认初始化的控制,最后你不能隐式地清理资源,因为静态对象没有析构函数。此外,你也不能为静态类实现IDisposable接口,所以似乎静态类永远不适合作为包装非托管资源的方式...
看起来单例模式是直接替代静态类的更好解决方案。但我的问题是 - 为什么编译器不支持静态销毁呢?毕竟,GC跟踪静态对象和实例的引用有什么区别呢?
在我的生产代码中,我尽量避免使用静态类,因为它们无法注入,没有对默认初始化的控制,最后你不能隐式地清理资源,因为静态对象没有析构函数。此外,你也不能为静态类实现IDisposable接口,所以似乎静态类永远不适合作为包装非托管资源的方式...
看起来单例模式是直接替代静态类的更好解决方案。但我的问题是 - 为什么编译器不支持静态销毁呢?毕竟,GC跟踪静态对象和实例的引用有什么区别呢?
“静态对象”并不存在。但是在任何应用程序域中加载的所有类型的静态变量都被视为垃圾收集根,直到卸载应用程序域。
如果您想在应用程序域卸载时执行操作,可以订阅AppDomain.DomainUnload和AppDomain.ProcessExit事件。
AppDomain.DomainUnload
事件是否可行?
mcl
是一个静态字段。它不是一个对象。区分这两者非常重要。 - Jon Skeet