¿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?


Respuestas:


172

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

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


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();
    }
}

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.


1

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


-3

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.