在下面的c#代码中,当它不再有用时,如何摆脱它们?是自动照顾,还是我需要做某事?
public void Test() { object MyObject = new object(); ... code ... }
Matt.. 18
自动.当MyObject超出范围时(在测试结束时),它被标记为垃圾收集.在将来的某个时刻,.NET运行时将为您清理内存
编辑:(为了完整起见,我应该指出,如果你在某处传递MyObject,它会通过引用传递,并且不会被垃圾收集 - 只有当不再有对象的引用浮动时,GC才可以自由地收集它)
编辑:在发布版本中,MyObject通常会在未使用时立即收集(有关详细信息,请参阅我的回答--dp)
自动.当MyObject超出范围时(在测试结束时),它被标记为垃圾收集.在将来的某个时刻,.NET运行时将为您清理内存
编辑:(为了完整起见,我应该指出,如果你在某处传递MyObject,它会通过引用传递,并且不会被垃圾收集 - 只有当不再有对象的引用浮动时,GC才可以自由地收集它)
编辑:在发布版本中,MyObject通常会在未使用时立即收集(有关详细信息,请参阅我的回答--dp)
简短的回答是:除非它有非托管资源(文件句柄等),否则你不必担心.
答案很长,涉及的更多.
当.NET决定要释放一些内存时,它会运行垃圾收集器.这将查找仍在使用的所有对象,并将其标记为这样.任何可能仍然被读取的局部变量(在任何线程的任何堆栈帧中)都与静态变量一样计为根.(事实上,我认为静态变量是通过实时类型对象引用的,它们通过实时AppDomain对象引用,但在大多数情况下,您可以将静态变量视为根.)
垃圾收集器查看根引用的每个对象,然后根据这些对象中的实例变量找到更多"实时"引用.它可以减少,查找并标记越来越多的对象为"实时".一旦完成此过程,它就可以查看所有其余对象并释放它们.
这是一个非常广泛的概念图 - 但是当你想到垃圾收集,终结器,并发收集等的代际模型时,它会变得更加详细.我强烈建议你通过C#阅读Jeff Richter的CLR.详情.他也有一个2个 部分的文章(从2000年复出,但仍然非常相关的),如果你不想买的书.
当然,所有这些并不意味着您不必担心.NET中的内存使用和对象生存期.特别是:
毫无意义地创建对象会降低性能.特别是,垃圾收集器很快但不是免费的.寻找在编码时减少内存使用的简单方法,但在您知道自己遇到问题之前进行微观优化也很糟糕.
通过使对象可以比预期更长时间来"泄漏"内存是可能的.造成这种情况的两个相当常见的原因是静态变量和事件订阅.(事件订阅使事件处理程序可以从事件发布者访问,但不是相反.)
如果您使用的内存(以实时,可访问的方式)比您可用的更多,您的应用程序将崩溃..NET可以做很多事情来防止这种情况发生!
使用非内存资源的对象通常实现IDisposable
.Dispose
完成对象后,您应该调用它们来释放这些资源.请注意,这不会释放对象本身 - 只有垃圾收集器才能这样做.即使面对异常using
,C#中的语句也是最方便的Dispose
可靠调用方式.