Dotnet 垃圾收集器

Dotnet garbage collector

我有一个 dotnet 应用程序,我看到它在内存方面一直在增长,所以我决定从这段代码开始做一些测试

Form f0 =null;
using(Form f1 = new Form())
{
   f0=f1;
   f0.Text="Hellow!";
   f0.ShowDialog();
}

f0.Text="Hellow, you here me";// exception attempt here but nothing happens.

这是我的第一个问题。

第二个: 当我在 Form 中有类似 DataGridView 的控件(并以此形式创建)时,默认标记为私有;假设我将其更改为 public,我想从外部(从表单)助手初始化列,它会改变垃圾收集器的方式吗?

第 1 部分: f0=f1; 表示您一直引用表单对象。

Form.Dispose(在 using 块的末尾调用)不会完全破坏表单对象。它释放某些非托管资源(如 window 和控制句柄等),但运行时对象(如 Form)仍然存在于内存中。 这些对象被标记为 ready to be garbage collected 但 GC 不会立即销毁它们。

这就是为什么 f0.Text="Hellow, you here me" 运算符在 using 之后没有空引用异常的原因。

但是 f0.Show()using 之后会失败 object disposed exception

第 2 部分: GC 计算对象引用,因此您使用的助手在保留对实例的引用之前不应破坏 GC

class Helper
{
public void AddColumn(Grid grid, string name)
{
 grid.Columns.Add(new GridColumn(name));
}
}

这不会在网格或网格列实例上存储引用,因此 GC 不受影响

处理一个对象并不意味着在垃圾回收方面它会突然无法访问。在您保留对此类对象的引用之前,它将被 GC 跟踪。

因此,即使您的表单位于 using 块的末尾,您仍然可以通过分配的 f0 引用访问它。看起来,您可以设置已处置 Form 的一些 public 属性,但在 using 块之外尝试 f0.ShowDialog ,您将得到一个 ObjectDisposedException.

关于第二个问题:没有任何代码很难说什么。但尽量不要将多个问题混合在一个 post 中。对您的一般问题的一般回答:不要保留助手 class 对创建的实例的任何引用,您会没事的。