Czy metoda Dispose () zostanie wywołana w instrukcji using z obiektem o wartości null?

179

Czy użycie usinginstrukcji na (potencjalnie) pustym obiekcie jest bezpieczne?
Rozważmy następujący przykład:

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

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

Czy jest zagwarantowane, że Disposezostanie wywołany tylko wtedy, gdy obiekt nie jest pusty, a ja nie otrzymam NullReferenceException?

Paolo Tedesco
źródło
1
Powiązane stackoverflow.com/questions/2513035
Brian Rasmussen

Odpowiedzi:

172

Tak, Dispose()jest wywoływana tylko w przypadku obiektów niezerowych:

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

reko_t
źródło
30
Zauważ, że nawet jeśli twoja zmienna ma wartość null, wykonywany jest blok using, a jeśli odwołasz się do zmiennej w bloku using bez uprzedniego sprawdzenia jej wartości null, otrzymasz NullReferenceException. Aby zapobiec błędnej interpretacji, ta odpowiedź powinna brzmieć: „Tak, Dispose()jest wywoływana tylko w przypadku obiektów niezerowych”.
surfowanie
37

Rozszerzenie usingsprawdza, czy obiekt nie jest nullprzed wywołaniem Disposego, więc tak, jest bezpieczny.

W twoim przypadku otrzymasz coś takiego:

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

Powinieneś być z tym w porządku:

using ((IDisposable)null) { }

Nie ma tutaj wyjątku.

Side uwaga: nie mylić z tym foreach, a IEnumerablegdy zostanie wyrzucony wyjątek.

Darin Dimitrov
źródło
1

Tak, przed usunięciem referencja zostanie zaznaczona jako null. Możesz sprawdzić siebie, przeglądając swój kod w Reflektorze.

oli
źródło
-3

Nie otrzymasz zerowego wyjątku odniesienia zgodnie z moim doświadczeniem. Zostanie po prostu zignorowany.

malajski
źródło