在Visual Studio(至少2010年)中编写VB.NET时,如果创建一个实现IDisposable
的类,IDE将为您生成此框架:
' IDisposable
Protected Overridable Sub Dispose(disposing As Boolean)
If Not Me.disposedValue Then
If disposing Then
' TODO: dispose managed state (managed objects).
End If
' TODO: free unmanaged resources (unmanaged objects) and override Finalize() below.
' TODO: set large fields to null.
End If
Me.disposedValue = True
End Sub
如果我正确理解垃圾收集,将字段设置为null将没有用处。*但是为什么Visual Studio会推荐它呢?
*假设您没有对正在处理的对象进行实时引用,这很奇怪。
答案 0 :(得分:5)
对于这个自动生成的代码,一般很少有人赞赏。这种一次性模式在过去10年中已经过时,优雅地被.NET 2.0中的关键终结器所取代。但是并没有完全消失,1.0天内的几个.NET类实现了它。当你从这样一个类派生出来时,你就不得不重写Dispose(Boolean)方法。遗憾的是,VB.NET编辑器不够智能,无法检测到这种情况。
对建议进行分类的最佳方法是不将其标记为正确,而是将其标记为“#34;没有错误”#34;。只要一个VB.NET程序员盲目地遵循这个建议,他就永远不会遇到麻烦。没错。
"将大字段设置为null"建议也完全属于"没有错误"类别。它通常不会有任何区别,但技术上可能是"大型物体"生活在早期的GC生成中。在创建一次性对象很久之后很久就分配了这种情况。将其设置为Nothing然后允许GC更早地释放它并且程序将更精简地运行。没错。
答案 1 :(得分:2)
有人可能会在任何时间内对被处置的对象进行引用。但是作为IDisposable类的实现者,你知道在Dispose()之后你不需要大对象。要允许尽快收集大对象,请将其设置为null。