3

在这个 VB.NET 代码中:

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

为什么需要将 o 设置为Nothing?如果我不将其设置NothingFinally块怎么办?我认为如果你不设置它是可以的,Nothing因为该对象将被标记为 GC。

4

2 回答 2

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出于习惯将东西设置为我认为不正确和糟糕的代码设计

于 2012-04-04T10:31:12.087 回答
0

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

于 2012-04-04T10:30:04.830 回答