Vb.net 为什么在Finally块中将对象设置为Nothing?

Vb.net 为什么在Finally块中将对象设置为Nothing?,vb.net,object,try-catch-finally,nothing,Vb.net,Object,Try Catch Finally,Nothing,在此VB.NET代码中: Dim o as SomeClass Try o = new SomeClass 'call some method on o here Catch(...) ... Finally o = Nothing End Try 为什么需要将o设置为Nothing?如果在Finally块中未将其设置为Nothing,该怎么办?我认为,如果不将其设置为“无”,就可以了,因为该对象将被标记为GC。这是因为该对象在外部使用不安全。。抓住。。最后一个街区。它

在此VB.NET代码中:

Dim o as SomeClass
Try
   o = new SomeClass
   'call some method on o here
Catch(...)
   ...
Finally
   o = Nothing
End Try

为什么需要将o设置为
Nothing
?如果在
Finally
块中未将其设置为
Nothing
,该怎么办?我认为,如果不将其设置为“无”,就可以了,因为该对象将被标记为GC。

这是因为该对象在外部使用不安全。。抓住。。最后一个街区。它不能保证它处于一致状态,因此它被设置为“无”,以表明它不应该被使用。

如果对象在try-catch之外使用不安全,那么应该这样做。例如,如果这是一个流,您会看到该流关闭,然后设置为nothing。这并不总是正确的做法,但这段代码经常被看到

考虑一下这个代码

Sub Main()
    Dim o As String
    Try
        o = "Hello"
        Console.Out.WriteLine("hi {0}", o)
    Catch ex As Exception
        ' do something here
    Finally
        o = Nothing
    End Try

    ' unable to do something here
End Sub

尽管这是一个愚蠢的例子,但它确实意味着您现在不能在外部引用o,因为它不再设置为对象的实例。这就是为什么很多人都这么做的原因。如果你在一个函数中,一个函数在这个点结束,就不需要设置为对象,因为对象脱离了范围,但是很多人会把东西设置成<代码>没有< /代码>习惯>强>实际上我认为错误和坏的代码设计>/P>。不。这是VB6和COM时代的延迟,当设置为
Nothing
时,实际上减少了对象上的引用计数。这是否意味着,作为一种实践,我应该在处理完所有对象后将它们设置为
Nothing
?@badmaash:不。正如krystan所说的“如果对象不安全使用”。绝大多数情况下它是不需要的。任何正确设计的类如果在处理后尝试使用它,都会抛出异常。将其设置为
Nothing
是多余的。我认为这是一个不好的模式,因为人们认为它确实起到了作用。它只会给你的代码增加噪音。而且,正如您所提到的,如果类的设计很差,以至于在不正确使用时不会引发异常,那么您肯定应该使用作用域。使用语句是最简单的,但是您也可以将其包装到一个新函数中。如果某个类具有.Dispose方法,您应该使用该方法:可能重复(忽略一个事实,即排名靠前的答案是C#。这与VB.NET完全相同。在VB.NET中,将对象设置为
Nothing
是完全多余的。请注意,这与基于COM的VB版本(如VB 6)不同。)