为什么Form需要设置为null?

时间:2014-02-21 16:06:02

标签: c# .net forms null dispose

我正在学习C#,我见过的示例程序我找到了这样的代码:

static CalibrationForm form = null;

和这个

public static void HideCalibration()
{
 form.Hide();
 form.Dispose();
 form = null;
}

表单应该设置为null是否有任何特殊原因?

表单的含义设置为null是什么意思?

3 个答案:

答案 0 :(得分:8)

在此(IMO穷人)示例中,form是一个static字段,其中包含对应用程序中所有位置可用的表单实例的引用。问题是Dispose() 还不够 - 如果static字段引用它,则无法进行垃圾回收,因为{{1} }字段不要超出范围。永远。将字段设置为static可以收集实例。

另请注意,对表单的任何引用都会使其保持活动状态 - 而不仅仅是此字段; 事件订阅是人为地保持活力的臭名昭着的方式。

但强调:这是一个可怕的例子。我不建议使用null字段中的表单进行编码。

答案 1 :(得分:0)

确保form内存中的所有引用都消失了。没有其他原因,事实上我相信它没有任何进一步的用处。

实际上,CLR所做的是保持包含所有类的托管堆,类不再有任何引用,它可以被垃圾收集,否则它不会。

在这种情况下,Dispose删除了Win32句柄,但没有删除从.NET部分分配的内存,所以这就是你将它设置为null的原因。

阅读this on GC internals

答案 2 :(得分:0)

HideCalibration方法中的最后一行可能是删除对表单的引用,以便垃圾收集器可以删除它并释放堆上的一些内存。

第一行(static CalibrationForm form = null;)只是为了明确静态变量的初始值是什么。