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ですか? ブロックに設定しないとどうNothingなりますか? オブジェクトがGC用にマークされるため、Finally設定しなくても問題ないと思います。Nothing

4

2 に答える 2

4

オブジェクトをtrycatchから使用するのが安全でない場合は、これを行う必要があります。たとえば、これがストリームの場合、ストリームが閉じられてから何も設定されていないことがわかります。常に正しいこととは限りませんが、このコードはよく見られます。

このコードを検討してください

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ブロックの外で安全に使用できないためです。一貫性のある状態であることが保証されていないため、使用されていないことを明確にするために「なし」に設定されています。

于 2012-04-04T10:30:04.830 に答える