2010-03-26 10 views
128

Ist es sicher, die using-Anweisung für ein (möglicherweise) Null-Objekt zu verwenden?
Betrachten Sie das folgende Beispiel:Verwendung der Anweisung mit einem Null-Objekt

class Test { 
    IDisposable GetObject(string name) { 
     // returns null if not found 
    } 

    void DoSomething() { 
     using (IDisposable x = GetObject("invalid name")) { 
      if (x != null) { 
       // etc... 
      } 
     } 
    } 
} 

ist sichergestellt, dass Dispose nur aufgerufen werden, wenn das Objekt nicht null ist, und ich werde keine NullReferenceException bekommen? hier

using ((IDisposable)null) { } 

Keine Ausnahme geworfen:

+3

Ich würde vorschlagen, es zu versuchen ... Sie haben den meisten Code, den Sie dort brauchen – cjk

+0

Related http://StackOverflow.com/Questions/2513035 –

Antwort

121

Ja, Dispose() wird nur auf nicht-null-Objekte genannt:

http://msdn.microsoft.com/en-us/library/yh598w02.aspx

+18

Beachten Sie, dass selbst wenn Ihre Variable null ist, der Verwendungsblock ist ausgeführt, und wenn Sie Ihre Variable innerhalb des using-Blocks referenzieren, ohne sie vorher zu prüfen, erhalten Sie NullReferenceException. Um Fehlinterpretationen zu vermeiden, sollte diese Antwort folgendermaßen lauten: "Ja,' Dispose() 'wird nur bei Nicht-Null-Objekten aufgerufen". – surfen

8

Sie sollten es in Ordnung sein.

Seitliche Anmerkung: verwechseln Sie das nicht mit foreach und IEnumerable, wo eine Ausnahme ausgelöst wird.

24

Die Erweiterung für using prüft, ob das Objekt nicht null vor dem Aufruf Dispose darauf ist, also ja, es ist sicher.

In Ihrem Fall würde man so etwas bekommen:

IDisposable x = GetObject("invalid name"); 
try 
{ 
    // etc... 
} 
finally 
{ 
    if(x != null) 
    { 
     x.Dispose(); 
    } 
} 
-2

Sie werden nicht null-Verweisausnahme nach meiner Erfahrung. Es wird einfach ignoriert.

0

Ja, bevor die Referenz Entsorgung Null-geprüft sein. Sie können sich selbst überprüfen, indem Sie Ihren Code in Reflector anzeigen.