Wird Dispose () in einer using-Anweisung mit einem Null-Objekt aufgerufen?

178

Ist es sicher, die usingAnweisung für ein (möglicherweise) Nullobjekt zu verwenden?
Betrachten Sie das folgende Beispiel:

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

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

Ist es garantiert, dass Disposenur aufgerufen wird, wenn das Objekt nicht null ist und ich keine bekomme NullReferenceException?

Paolo Tedesco
quelle
1
Verwandte stackoverflow.com/questions/2513035
Brian Rasmussen

Antworten:

171

Ja, Dispose()wird nur für Nicht-Null-Objekte aufgerufen:

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

reko_t
quelle
30
Beachten Sie, dass selbst wenn Ihre Variable null ist, der using-Block ausgeführt wird. Wenn Sie Ihre Variable innerhalb des using-Blocks referenzieren, ohne sie zuvor auf null zu überprüfen, erhalten Sie die NullReferenceException. Um Fehlinterpretationen zu vermeiden, sollte diese Antwort lauten: "Ja, Dispose()wird nur für Nicht-Null-Objekte aufgerufen".
Surfen
36

Die Erweiterung für usingprüft, ob das Objekt nicht vorhanden ist, nullbevor Disposees aufgerufen wird. Ja, es ist sicher.

In Ihrem Fall würden Sie so etwas bekommen wie:

IDisposable x = GetObject("invalid name");
try
{
    // etc...
}
finally
{
    if(x != null)
    {
        x.Dispose();
    }
}
João Angelo
quelle
14

Sie sollten damit einverstanden sein:

using ((IDisposable)null) { }

Keine Ausnahme hier geworfen.

Randnotiz: Verwechseln Sie dies nicht mit foreachund IEnumerablewo eine Ausnahme ausgelöst wird.

Darin Dimitrov
quelle
1

Ja, vor dem Entsorgen wird die Referenz auf Null gesetzt. Sie können sich selbst überprüfen, indem Sie Ihren Code in Reflector anzeigen.

oli
quelle
-3

Nach meiner Erfahrung erhalten Sie keine Nullreferenzausnahme. Es wird einfach ignoriert.

malaiisch
quelle