Pergunta

É seguro usar o using declaração em um objeto (potencialmente) nulo?
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 Dispose será chamado apenas se o objeto não for nulo, e eu não vou receber um NullReferenceException?

Foi útil?

Solução

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

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

Outras dicas

A expansão para using verifica se o objeto não é null antes de ligar Dispose Nele, então sim, é seguro.

No seu caso, você conseguiria algo como:

IDisposable x = GetObject("invalid name");
try
{
    // etc...
}
finally
{
    if(x != null)
    {
        x.Dispose();
    }
}

Você deveria estar bem com isso:

using ((IDisposable)null) { }

Nenhuma exceção jogada aqui.

Nota lateral: não confunda isso com foreach e IEnumerable onde uma exceção será lançada.

Sim, antes de descartar a referência, será verificado nulo. Você pode se examinar visualizando seu código no refletor.

Você não terá exceção de referência nula de acordo com minha experiência. Será simplesmente ignorado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top