我对对象的垃圾回收过程感到困惑。
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/