当前位置:  开发笔记 > 编程语言 > 正文

你怎么摆脱c#中的一个对象

如何解决《你怎么摆脱c#中的一个对象》经验,为你挑选了2个好方法。

在下面的c#代码中,当它不再有用时,如何摆脱它们?是自动照顾,还是我需要做某事?

public void Test()
{
   object MyObject = new object();

   ... code ...
}

Matt.. 18

自动.当MyObject超出范围时(在测试结束时),它被标记为垃圾收集.在将来的某个时刻,.NET运行时将为您清理内存

编辑:(为了完整起见,我应该指出,如果你在某处传递MyObject,它会通过引用传递,并且不会被垃圾收集 - 只有当不再有对象的引用浮动时,GC才可以自由地收集它)

编辑:在发布版本中,MyObject通常会在未使用时立即收集(有关详细信息,请参阅我的回答--dp)



1> Matt..:

自动.当MyObject超出范围时(在测试结束时),它被标记为垃圾收集.在将来的某个时刻,.NET运行时将为您清理内存

编辑:(为了完整起见,我应该指出,如果你在某处传递MyObject,它会通过引用传递,并且不会被垃圾收集 - 只有当不再有对象的引用浮动时,GC才可以自由地收集它)

编辑:在发布版本中,MyObject通常会在未使用时立即收集(有关详细信息,请参阅我的回答--dp)



2> Jon Skeet..:

简短的回答是:除非它有非托管资源(文件句柄等),否则你不必担心.

答案很长,涉及的更多.

当.NET决定要释放一些内存时,它会运行垃圾收集器.这将查找仍在使用的所有对象,并将其标记为这样.任何可能仍然被读取的局部变量(在任何线程的任何堆栈帧中)都与静态变量一样计为.(事实上​​,我认为静态变量是通过实时类型对象引用的,它们通过实时AppDomain对象引用,但在大多数情况下,您可以将静态变量视为根.)

垃圾收集器查看根引用的每个对象,然后根据这些对象中的实例变量找到更多"实时"引用.它可以减少,查找并标记越来越多的对象为"实时".一旦完成此过程,它就可以查看所有其余对象并释放它们.

这是一个非常广泛的概念图 - 但是当你想到垃圾收集,终结器,并发收集等的代际模型时,它会变得更加详细.我强烈建议你通过C#阅读Jeff Richter的CLR.详情.他也有一个2个 部分的文章(从2000年复出,但仍然非常相关的),如果你不想买的书.

当然,所有这些并不意味着您不必担心.NET中的内存使用和对象生存期.特别是:

毫无意义地创建对象降低性能.特别是,垃圾收集器很快但不是免费的.寻找在编码时减少内存使用的简单方法,但在您知道自己遇到问题之前进行微观优化也很糟糕.

通过使对象可以比预期更长时间来"泄漏"内存是可能的.造成这种情况的两个相当常见的原因是静态变量和事件订阅.(事件订阅使事件处理程序可以从事件发布者访问,但不是相反.)

如果您使用的内存(以实时,可访问的方式)比您可用的更多,您的应用程序将崩溃..NET可以做很多事情来防止这种情况发生!

使用非内存资源的对象通常实现IDisposable.Dispose完成对象后,您应该调用它们来释放这些资源.请注意,这不会释放对象本身 - 只有垃圾收集器才能这样做.即使面对异常using,C#中的语句也是最方便的Dispose可靠调用方式.

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有