我正在学习C#,我见过的示例程序我找到了这样的代码:
static CalibrationForm form = null;
和这个
public static void HideCalibration()
{
form.Hide();
form.Dispose();
form = null;
}
表单应该设置为null是否有任何特殊原因?
表单的含义设置为null是什么意思?
答案 0 :(得分:8)
在此(IMO穷人)示例中,form
是一个static
字段,其中包含对应用程序中所有位置可用的表单实例的引用。问题是Dispose()
还不够 - 如果static
字段引用它,则无法进行垃圾回收,因为{{1} }字段不要超出范围。永远。将字段设置为static
可以收集实例。
另请注意,对表单的任何引用都会使其保持活动状态 - 而不仅仅是此字段; 事件订阅是人为地保持活力的臭名昭着的方式。
但强调:这是一个可怕的例子。我不建议使用null
字段中的表单进行编码。
答案 1 :(得分:0)
确保form
内存中的所有引用都消失了。没有其他原因,事实上我相信它没有任何进一步的用处。
实际上,CLR所做的是保持包含所有类的托管堆,类不再有任何引用,它可以被垃圾收集,否则它不会。
在这种情况下,Dispose
删除了Win32句柄,但没有删除从.NET部分分配的内存,所以这就是你将它设置为null的原因。
答案 2 :(得分:0)
HideCalibration
方法中的最后一行可能是删除对表单的引用,以便垃圾收集器可以删除它并释放堆上的一些内存。
第一行(static CalibrationForm form = null;
)只是为了明确静态变量的初始值是什么。