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.