为什么表单需要设置为空



我正在学习 C#,我看到的示例程序我发现代码如下:

static CalibrationForm form = null;

而这个

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

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

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

在此(IMO 差)示例中,form 是一个static字段,其中包含对将从应用程序中的所有位置可用的表单实例的引用。问题是Dispose()是不够的 - 如果它被static字段引用,则无法对其进行垃圾回收,因为static字段不会超出范围。曾。将字段设置为 null 允许收集实例。

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

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

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

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

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

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

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

阅读有关 GC 内部结构的信息。

相关内容

  • 没有找到相关文章

最新更新