将对象设置为空

时间:2009-02-24 17:02:26

标签: .net vb.net

每次我询问开发人员时,我都希望得到不同的答案。所以我认为看到每个人做的事情都是一个很好的问题。

如果你有一个sqlClient.sqlconnection对象,在清理代码(最后是块等)中你是处置对象还是将它设置为空,或者两者兼而有之?

我总是只是调用dispose,并允许垃圾收集器做它的事情......

8 个答案:

答案 0 :(得分:4)

看看my answer to a similar question。将变量设置为null / Nothing很少需要。调用Dispose 是必要的。

答案 1 :(得分:3)

你基本上做的是正确的事情。在调用.Dispose()之后,您可以确保清除连接分配的资源。然后,只要您在代码中声明的SqlConnection对象超出范围,GC就会清理该内存。

如果你想刺激GC,你可以随时调用它.Collect()方法。

答案 2 :(得分:1)

您无需将变量设置为Nothing,只需处置即可。

答案 3 :(得分:1)

杰夫阿特伍德对此有一个recent blog post ......

除非你不相信垃圾收集器,否则似乎没有必要。我已经完全停止这样做了,并且最常使用“使用”语法,这种语法简洁易懂。

答案 4 :(得分:0)

如果在反射器中打开带有“= Nothing”的代码,您将看到编译器(通常)已删除/优化了该语句。

现在,如果你做这样的检查。

If myObject IsNot Nothing Then
  myObject = Nothing
End If

编译器可能不会对此进行优化,这将导致您在必要时间之后保持对myObject的引用,从而导致对象等待的时间超过了必要的时间才有资格获得GC。

理想情况下,您应该尽快处理对象并将其置之不理。

答案 5 :(得分:0)

如果类型具有Dispose,则使用该。

如果类型没有Dispose,并且它保留了大量内存,那么在执行一些慢速操作(而不是坚持下去)之前将引用设置为空可以帮助避免“中年危机”。

然而,编译器在优化这种情况并在块结束之前很好地释放参考时变得更好。

答案 6 :(得分:0)

我始终确保通过使用'using'块来处理它们,但从不将它们设置为null。 MSDN也不要求我们这样做。

我很乐意了解其他人必须明确将ref设置为null的任何原因。 处理后使用对象无论如何都会抛出'ObjectDisposedException',因此在处置后意外使用不是一个原因。

答案 7 :(得分:0)

我同意,只要对象实现了一个必须调用它的dispose()方法,处理是强制性的,因为当某个对象实现dispose()方法时,这意味着他不能指望GC释放它在这种情况下,他一直在使用的资源(即他正在使用非托管资源),是的,您必须调用dispose才能释放这些非托管资源。关于将引用设置为null,这没有必要,但毫无疑问它仍然是一个很好的编程实践。这里真正有趣的是,任何人都可以使用被处置的物体或没有参照物的物体(即死亡(或者说即将死亡)物体能够复活吗? 看看以下内容:

公共类员工{

    public static Employee emp;

    public string Name { get; set; }
    public string Position { get; set; }

    public override string ToString() {
        return String.Format("{0} works as {1}", Name, Position);
    }

    ~Employee() {
        emp = this;
    }
}