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

时间:2012-04-04 10:28:00

标签: 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?如果我没有在Nothing区块中将其设置为Finally,该怎么办?我认为如果你没有将它设置为Nothing就可以了,因为该对象将被标记为GC。

2 个答案:

答案 0 :(得分:4)

如果对象不安全,可以尝试使用try catch。例如,如果这是一个流,您会看到流已关闭,然后设置为空。它并不总是正确的,但这段代码可以看到很多。

考虑这段代码

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,因为它不再被设置为对象的实例。这就是为什么它由很多人完成的原因。如果你在一个函数中并且一个函数在那一点结束,那么就没有必要设置为Nothing,因为对象超出了范围,但很多人会根据习惯将内容设置为Nothing 我会考虑不正确和错误的代码设计

答案 1 :(得分:0)

这是因为在try .. catch .. finally块之外使用对象是不安全的。它不能保证它处于一致的状态,因此设置为Nothing以使其显然不应该被使用。