Dispose () será chamado em uma instrução using com um objeto nulo?

179

É seguro usar a usinginstrução em um objeto nulo (potencialmente)?
Considere o seguinte exemplo:

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

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

É garantido que Disposeserá chamado apenas se o objeto não for nulo e eu não receberei um NullReferenceException?

Paolo Tedesco
fonte
1
Relacionados stackoverflow.com/questions/2513035
Brian Rasmussen

Respostas:

172

Sim, Dispose()é chamado apenas em objetos não nulos:

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

reko_t
fonte
30
Observe que, mesmo que sua variável seja nula, o bloco using é executado e, se você referenciar sua variável dentro do bloco using sem primeiro checá-la, você obterá NullReferenceException. Para evitar erros de interpretação, esta resposta deve declarar: "Sim, Dispose()é chamado apenas em objetos não nulos".
surfen
37

A expansão para usingverificar se o objeto não está nullantes de chamá Dispose-lo, portanto, é seguro.

No seu caso, você obteria algo como:

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

Você deve ficar bem com isso:

using ((IDisposable)null) { }

Nenhuma exceção lançada aqui.

Nota lateral: não confunda isso com foreache IEnumerableonde uma exceção será lançada.

Darin Dimitrov
fonte
1

Sim, antes de Descartar, a referência será verificada como nula. Você pode se examinar visualizando seu código no Reflector.

oli
fonte
-3

Você não receberá uma exceção de referência nula conforme minha experiência. Será simplesmente ignorado.

malaio
fonte