gpt4 book ai didi

c# - 垃圾回收如何处理对象引用?

转载 作者:可可西里 更新时间:2023-11-01 09:17:22 24 4
gpt4 key购买 nike

我对对象的垃圾回收过程感到困惑。

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 不会收集垃圾。不会。您不能显式地对特定对象进行垃圾回收。您可以调用 GC.Collect()请求垃圾收集器运行,但这并不相同。调用 Dispose 甚至不会“断开”对象与特定变量的连接,事实上......当该变量保持事件状态时(直到 JIT 可以检测到它将再次读取的最后一次) 它将防止对象被垃圾回收。

一个对象在不再被任何东西引用之前不会被垃圾回收。诚然,在某些极端情况下,这可能比您想象的要早,但您很少需要担心这些。

值得注意的是,Dispose 和垃圾收集是截然不同的事情。您调用 Dispose 来释放非托管资源(网络连接等)。垃圾收集只是为了释放内存。无可否认,垃圾回收可以通过最终确定,这可能会作为最后的手段释放非托管资源,但大多数时候您应该明确地处理非托管资源。

关于c# - 垃圾回收如何处理对象引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3479262/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com