在C#2.0 winform应用程序中将托管对象设置为null通常是一个好主意,即在关闭它们时将其设置为表单和控件,或者我应该将其留给垃圾收集。
我的项目中的一个类名为Job,它存储String和Lists类型等。是否有必要这样做:
if (Job != null)
{
Job = null;
}
或者这只是非托管资源所必需的,例如具有dispose方法的文件句柄。我绝对应该调用它,然后设置为null。
任何澄清都会很棒。谢谢。
答案 0 :(得分:6)
不 - 当你关闭应用程序时,你应该做任何你需要的事情来清除文件句柄之类的东西(或者你可能丢失数据)但你不需要担心内存。你的进程即将崩溃 - 除非出现操作系统错误,否则它不可能占用任何内存!
即使您的进程不是即将终止,您通常也不应将变量设置为null。几乎在所有情况下,垃圾收集器都会做你想要的。如果你知道变量本身仍然是“实时”,你只需要将一个变量设置为null,但是你不希望它当前引用的对象被该变量保持活着状态。这非常罕见。
答案 1 :(得分:2)
不,这没用。如果您的应用程序将被停止,那么当进程终止时,内存,文件句柄等将被释放......
答案 2 :(得分:2)
没有。在C#中没有必要。此规则来自C / C ++,其中最好在free / delete调用后将变量设置为NULL:
T *foo = new T();
// ...
if (foo) {
delete foo;
foo = NULL;
}
在这种情况下,你总是知道如果foo != NULL
那么对象仍然存在,反之,如果foo == NULL
那么对象肯定已经死了。
答案 3 :(得分:2)
你应该把它留给垃圾收集者 是的,只有非托管资源才需要设置为null(或其他手动垃圾处理方法)。
答案 4 :(得分:0)
以下是Dispose
的示例答案 5 :(得分:0)
桌面应用程序的.Net框架会在您单击使用它编译的程序时实例化,它的作用是获取进程空间并在其中加载程序,这样它就可以管理它承诺提供的所有内容例如垃圾收集。因此,处理受管资源不是强制性的,因为它在从内存中卸载之前会自动执行,但是对于 UNMANAGED资源,您必须自行处理它们,否则.net不承诺处置它们。
答案 6 :(得分:0)
不,在关闭应用程序之前,不需要设置对null的引用,也不需要在处理它们之后设置托管对象和一次性对象。
垃圾收集器只关心是否可以使用引用。当您退出表单类时,其中的每个成员都无法访问并且可以被收集,因此将任何引用设置为null只是浪费时间。
答案 7 :(得分:0)
不,没有必要,垃圾收集器会这样做。