2012-04-04 8 views
3

In diesem Code VB.NET:Warum ein Objekt im Block Finally auf Nothing setzen?

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

Warum ein Bedarf o Nothing zu setzen ist? Was passiert, wenn ich es nicht auf Nothing im Finally Block setze? Was ich denke ist, dass es in Ordnung ist, wenn Sie es nicht auf Nothing setzen, weil das Objekt für GC markiert wird.

+0

Wenn Someclass eine .Dispose Methode hat, sollten Sie diese wählen: http://stackoverflow.com/questions/12368/how-to-dispose-a-class-in-net –

+0

möglich Duplikat von [NULL bei einer Klasse aufrufen vs. Dispose()] (http://stackoverflow.com/questions/574019/calling-null-on-a-class-vs-dispose) (Ignoriere die Tatsache, dass die bestbewertete Antwort ist In C# ist das genau so, für VB.NET ist es in VB.NET * völlig überflüssig, ein Objekt auf 'Nothing' zu setzen te das unterscheidet sich von den COM-basierten Versionen von VB wie VB 6.) –

Antwort

4

Wenn das Objekt unsicher ist, aus dem Versuch zu versuchen, sollte dies geschehen. Wenn dies beispielsweise ein Stream wäre, würde der Stream geschlossen und dann auf nichts gesetzt werden. Es ist nicht immer das Richtige, aber dieser Code wird oft gesehen.

betrachten diesen Code

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 es ein dummes Beispiel ist es nicht o außerhalb jetzt Referenz bedeutet, weil es nicht auf eine Instanz eines Objekts länger eingestellt ist. Deshalb wird es von vielen Leuten gemacht. Wenn Sie in einer Funktion sind und eine Funktion an diesem Punkt endet, ist es nicht notwendig, auf Nothing zu setzen, da das Objekt außerhalb des Geltungsbereichs liegt, aber viele Leute werden aus Gewohnheit Nothing einstellen Ich würde das inkorrekten und schlechten Code betrachten Design

+0

Bedeutet das, dass ich als Übung alle Objekte auf "Nothing" setzen sollte, wenn ich mit ihnen fertig bin? – badmaash

+1

@badmaash: Nein. Krystan sagte nur "Wenn das Objekt unsicher ist". Die meiste Zeit wird es nicht benötigt. –

+1

Jede Klasse, die korrekt entworfen wurde, löst eine Ausnahme aus, wenn Sie versuchen, sie zu verwenden, nachdem sie entsorgt wurde. Es ist überflüssig, es auf "Nichts" zu setzen. Und ich würde argumentieren, dass es ein schlechtes Muster ist, in das man einsteigen kann, weil die Leute denken, dass es tatsächlich etwas bewirkt. Es fügt nur Rauschen zu Ihrem Code hinzu. Und, wie Sie erwähnen, wenn die Klasse * schlecht entworfen ist, so dass sie * bei unsachgemäßer Verwendung keine Ausnahme auslöst, sollten Sie Scoping zu Ihrem Vorteil verwenden. Eine 'Using'-Anweisung ist die einfachste Sache, aber Sie können sie auch in eine neue Funktion einfügen. –

0

Es ist, weil das Objekt nicht sicher ist, außerhalb des try .. catch .. finally Block zu verwenden. Es ist nicht garantiert, dass es in einem konsistenten Zustand ist, daher ist es auf Nichts eingestellt, um es offensichtlich zu machen, dass es nicht verwendet werden soll.

+3

Eigentlich. Nein. Das ist ein Holdover von VB6 und COM Tagen, wenn die Einstellung auf "Nothing" die Referenzzählung für das Objekt tatsächlich verringert hat. –