¿Se llamará a Dispose () en una declaración de uso con un objeto nulo?

179

¿Es seguro usar la usingdeclaración en un objeto (potencialmente) nulo?
Considere el siguiente ejemplo:

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

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

¿Se garantiza que Disposese invocará solo si el objeto no es nulo y no obtendré un NullReferenceException?

Paolo Tedesco
fuente

Respuestas:

172

Sí, Dispose()solo se llama en objetos no nulos:

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

reko_t
fuente
30
Tenga en cuenta que incluso si su variable es nula, el bloque de uso se ejecuta, y si hace referencia a su variable dentro del bloque de uso sin primero verificarlo, obtendrá NullReferenceException. Para evitar interpretaciones erróneas, esta respuesta debe indicar: "Sí, Dispose()solo se llama a objetos no nulos".
surfen
37

La expansión para usingverifica que el objeto no esté nullantes de invocarlo Dispose, así que sí, es seguro.

En su caso, obtendría algo como:

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

Deberías estar de acuerdo con eso:

using ((IDisposable)null) { }

Ninguna excepción lanzada aquí.

Nota al margen: no confunda esto con foreachy IEnumerabledónde se lanzará una excepción.

Darin Dimitrov
fuente
1

Sí, antes de desechar la referencia se verificará de forma nula. Puede examinarse viendo su código en Reflector.

oli
fuente
-3

No obtendrá una excepción de referencia nula según mi experiencia. Simplemente será ignorado.

malayo
fuente