c# – 如果一个对象已被处理掉,是否会抑制gc终结器保存一段时间?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 如果一个对象已被处理掉,是否会抑制gc终结器保存一段时间?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1626字,纯文字阅读大概需要3分钟。
内容图文
垃圾收集可能会成为一个耗时的过程.在这方面,GC往往只在必要时才起作用.如果已经处理了一个物体,以帮助节省时间并帮助GC,那么GC的终结器是否应被抑制?
using(var sO = new someObject())
{
//work with object
}
public class someObject : IDisposable
{
internal Stream someResource;
internal Context someContext;
public void Dispose()
{
someContext.Dispose();
someResource.Dispose();
//A: does suppressing the GC finalizer here save time for the GC?
//B: can this cause memory leaks?
//GC.SuppressFinalize(this);
}
}
解决方法:
澄清一些困惑:
>如果需要以某种特殊方式清理非托管资源,则只需要终结器.
>如果您没有非托管资源,那么您不需要终结器.
>如果你有一个终结器,那么你一定要实现IDisposable.
>如果你有一个终结器,那么你应该在Dispose中调用GC.SuppressFinalize,因为如果你已经自己清理完毕后不需要调用终结器.
>如果你有终结器,你只需要调用GC.SuppressFinalize.如果你不这样做,你可能仍然想把它称为防御措施.
does suppressing the GC finalizer here save time for the GC?
如果有非托管资源且您的对象有终结器,那么是;如果你不压制它,你的对象可能会在终结队列中存活很长时间.您处置的资源也可能需要很长时间才能完成(例如,关闭昂贵的I / O通道).
如果你没有终结器,你说你没有任何不受管理的东西要清理.你仍然应该将SuppressFinalize称为防御措施.
根据FxCop规则:
“Failure to suppress finalization degrades performance and provides no benefits.”
对于你的其他问题,
can this cause memory leaks?
在此示例中,是,如果任何资源未受管理.如果您的对象在有机会调用Dispose之前以某种不寻常的方式终止,则将无法正确释放非托管资源.考虑如果someResource是非托管的,会发生什么情况,并在您使用someObject实例时抛出异常.
如果您的对象持有非托管资源并且您需要保证清理这些资源,那么您也需要一个终结器(在您的情况下将命名为~someObject).
内容总结
以上是互联网集市为您收集整理的c# – 如果一个对象已被处理掉,是否会抑制gc终结器保存一段时间?全部内容,希望文章能够帮你解决c# – 如果一个对象已被处理掉,是否会抑制gc终结器保存一段时间?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。