微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 垃圾收集如何在对象引用上工作?

我对垃圾收集过程感到困惑.
object A = new object();
object B = A;        
B.dispose();

通过在变量B上调用dispose,创建的对象将不会被垃圾回收
因为对象仍由A引用.

现在以下代码的工作方式与上述相同?

public static image Test1()
{
    Bitmap A = new Bitmap();
    return A;
}

现在我从一些其他方法称这个静态函数.

public void TestB()
{
   Bitmap B = Test1();
   B.dispose();
}

静态函数Test1返回对Bitmap对象的引用.引用被保存
在另一个变量B中.通过在B上调用dispose,B和对象之间的连接丢失,但是从Test1传递的引用会发生什么.直到功能TestB的范围完成才能保持活动状态吗?

有没有办法立即处理从静态函数传递的引用?

解决方法

我可能会离开,但是你似乎对dispose和垃圾回收有误解.一旦对所有引用的对象都将以非确定性的方式消失,垃圾回收将被收集.处理通常会摆脱非托管资源,所以对象准备好被垃圾回收.在你的第一个例子中,你放弃了对象,理论上使它不可用,但是它仍然存在于堆上,而且还有一个对A和B的引用.一旦超出范围,垃圾回收器就可以回收那个内存但并不总是.在示例2中,位图A放置在堆上,然后返回它的引用,并将B设置为该引用.然后你处理它,B超出范围.在这一点上,没有更多的引用存在,它将在以后被垃圾回收.

原文地址:https://www.jb51.cc/csharp/95547.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐