完成后,是否应将所有对象设置为null(在VB.NET中为Nothing)?

我明白这一点.NET处理实现IDisposable接口的对象的任何实例以释放一些资源是至关重要的,尽管对象在被处理后仍然可以是某种东西(因此isDisposed属性在表单中),所以我假设它仍然可以驻留在内存中,或者至少部分地驻留在内存中?

我还知道,当一个对象超出作用域时,它会被标记为要进行收集,为垃圾收集器的下一次运行做好准备(尽管这可能需要时间).

因此,考虑到这一点,将其设置为null会加快系统释放内存的速度,因为它不必计算出它不再在范围内,它们是否有任何不良副作用?

MSDN文章从来没有在示例中这样做过,目前我做不到这一点

推荐答案

Karl完全正确,使用后无需将对象设置为null.如果一个对象实现了IDisposable,只需确保在处理完该对象(包装在try..finallyusing()块中)后调用IDisposable.Dispose()即可.但是,即使您不记得调用Dispose(),对象上的finalizer方法也应该为您调用Dispose().

我认为这是一种很好的治疗:

Digging into IDisposable

还有这个

Understanding IDisposable

试图对GC及其管理策略进行二次猜测是没有任何意义的,因为它是self 调整和不透明的.与Jeffrey Richter在Dot Net Rocks上就内部工作进行了很好的讨论:Jeffrey Richter on the Windows Memory Model

.net相关问答推荐

在 .NET 7 项目上设置 Sentry 时遇到问题

MassTransit RespondAsync 无法返回空值

使用 SSH.NET 查找具有特定文件名的最新 SFTP 文件

C#字符串的GetHashCode()是如何实现的?

如何在 ASP.NET Core MVC 中读取操作方法的属性?

使用 Thread.Abort() 有什么问题

如何在没有抽象基类的情况下强制覆盖后代中的方法?

将 DataRowCollection 转换为 IEnumerable

发布版本中的 Debug.WriteLine

来自奥尔森时区的 .NET TimeZoneInfo

ILMerge 最佳实践

.Net 中的 Int128?

在 Moq Callback() 调用中设置变量值

如何在 .NET 中将字符串转换为字节数组?

将 C# 编译为本机?

如何对 LINQ to XML 中的元素进行深层复制?

什么是 ToString("N0") 格式?

为什么 .NET 中没有 Tree 类?

obj 文件夹是为了什么而生成的?

Windows 服务在哪个目录中运行?