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?


Antworten:


171

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

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


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();
    }
}

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.


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.


-3

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.