vb.net - 为什么 Visual Studio 建议 "TODO: set large fields to null."?

标签 vb.net visual-studio-2010 visual-studio

在 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 会推荐它呢?

*假设您没有保存对正在处置的对象的实时引用,这会很奇怪。

最佳答案

一般来说,这个自动生成的代码没有什么值得钦佩的地方。一次性模式在过去 10 年里已经过时,被 .NET 2.0 中的关键终结器优雅地取代。但并没有完全消失,1.0 时代的几个 .NET 类都实现了它。当您从这样的类派生时,您将不得不重写 Dispose(Boolean) 方法。遗憾的是,VB.NET 编辑器不够智能,无法检测到这种极端情况。

对建议进行分类的最佳方法是不要将其标记为正确,而是标记为“没有错误”。只要 VB.NET 程序员盲目遵循建议,他们就永远不会遇到麻烦。这没有什么问题。

“将大字段设置为空”建议也完全属于“没有错误”的类别。它通常不会产生任何影响,但从技术上讲,“大对象”可能存在于较早的 GC 代中。当它被分配得很晚,在一次性对象创建很久之后,这种情况就很可能发生。将其设置为 Nothing 然后允许 GC 更早地释放它,并且程序将运行得更精简。这没有什么问题。

关于vb.net - 为什么 Visual Studio 建议 "TODO: set large fields to null."?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31729785/

相关文章:

c# - 自定义用户控件引发异常时C#Visual Studio 2017崩溃

c++ - 如何为 Ctags 无法处理的 MSVC 文件夹的所有 C++ 头文件生成标签文件?

c# - .NET Winforms DataGridView - 任何嵌套方式?

c# - 如何读取故障转储文件(我有源代码和 .pdb 文件)

c# - 如何检测我的 .NET 程序集是从网站运行还是从桌面计算机运行?

c++ - 空析构函数导致代码缓慢?

c - InterlockedBitTestAndReset64() 未定义

sql - VB.NET 声明错误

MySQL 查询,3 个表,t1-t2 然后更新 t3。我怎样才能以最有效的方式做到这一点?

c# - MVC3 vb.net 到 C# WebGrid 问题