加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 06:27:15 所属栏目:百科 来源:网络整理
导读:我对垃圾收集过程感到困惑. object A = new object();object B = A; B.Dispose(); 通过在变量B上调用Dispose,创建的对象将不会被垃圾回收 因为对象仍由A引用. 现在以下代码的工作方式与上述相同? public static image Test1(){ Bitmap A = new Bitmap(); re
我对垃圾收集过程感到困惑.
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超出范围.在这一点上,没有更多的引用存在,它将在以后被垃圾回收.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读