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