我正在学习 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 内部结构的信息。