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

标签 c# .net asp.net garbage-collection static-methods

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

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/

相关文章:

c# - 使用 C# 从 Mettler Toledo (IND560) 秤设备读取数据

.net - 如何根据 WPF 中的 bool 属性设置背景颜色

.net - 使用传输安全和证书的 WCF 服务出现 SSL 错误。验证

c# - 我如何在 C# 中向 Outlook 2010 发送电子邮件?

asp.net - 构建时验证所有 ASPX、ASCX 和 HTML 文件

javascript - Angular 发布到 ASP.NET Core Web API 返回失败

c# - 在选择要写入新应用程序的第一个 "class"时,您应该如何决定?

c# - 使用 c# (telerik) 在 wpf 中自定义弹出窗口设计

C#.NET 组合框控件

.net - 如何指示 Ninject 从其隐式绑定(bind)列表中隐藏类型