2012-04-04 8 views
3

なぜfinallyブロックのNothingにオブジェクトを設定するのですか?このVB.NETコードで

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

なぜNothingにoを設定する必要がありますか? FinallyブロックのNothingに設定しないとどうなりますか?私は、オブジェクトがGC用にマークされるので、Nothingに設定しないと問題ないと思います。

+0

工assが.Disposeメソッドを持っている場合、あなたはそれを使用する必要があります。 http://stackoverflow.com/questions/12368/how-to-dispose-a-class-in-net –

+0

可能重複[クラスに対するDispose()の呼び出し](http://stackoverflow.com/questions/574019/calling-null-on-a-class-vs-dispose)(トップ評価された回答がC#ではVB.NETと全く同じです.Nothingにオブジェクトを設定すると、VB.NETでは完全に不要です。 VBのVBのようなCOMベースのバージョンとは異なります。 –

答えて

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 

それは愚かな例ですAllthoughそれはそれはもはやオブジェクトのインスタンスに設定されているので、あなたが今、外oを参照することはできません意味して検討してください。そういうわけで、それは多くの人々によって行われます。あなたが関数内にあり、関数がその時点で終了している場合、オブジェクトがスコープから外れるのでNothingに設定する必要はありませんが、たくさんの人が習慣の中でNothingに設定します不正確で悪いコードデザイン

+0

それは、練習として、私はそれらと一緒に完了したら、すべてのオブジェクトを 'Nothing'に設定する必要があるのでしょうか? – badmaash

+1

@badmaash:いいえ。krystanは「オブジェクトが使用するのが安全でない場合」と述べています。大部分の時間は必要ありません。 –

+1

正しく設計されたクラスは、処分された後に使用しようとすると例外をスローします。それを 'Nothing'に設定するのは余計です。そして、私はそれが実際に何かをしていると人々が思うので、それに入るのは悪いパターンだと主張したいと思います。それはあなたのコードにノイズを追加するだけです。あなたが言及しているように、クラス*が不適切な使い方で例外をスローしないように*設計されていない場合は、間違いなくスコープを使用するべきです。 'Using'ステートメントが最も簡単ですが、新しい関数にラップすることもできます。 –

0

オブジェクトがtry .. catch .. finallyブロックの外側で使用するのが安全でないためです。それは一貫性のある状態であることを保証されていないので、使用されるべきではないことを明白にするためにNothingに設定されています。

+3

実際には。いいえ。これはVB6とCOMの時代のホールドオーバーです.Nothingはオブジェクトの参照カウントを実際に減らしました。 –

関連する問題