在这个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。
答案 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以使其显然不应该被使用。