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 对创建的实例的任何引用,您会没事的。
我有一个 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 对创建的实例的任何引用,您会没事的。