2009-04-01 13 views
13

¿Funcionará el siguiente código si el recurso no implementa IDisposable?¿Se va a usar el trabajo en null?

T resource = new T(); 
    using (resource as IDisposable) 
    { 
    ... 
    } 
+1

pero ... ¿por qué harías eso? –

+1

Creo que la pregunta es válida y no entiendo por qué sombody downvoted it. – alex

Respuesta

10

sí, va a trabajar, marque esta prueba de funcionamiento:

[TestMethod] 
public void TestMethod8() 
{ 
    using (new MyClass() as IDisposable) 
    { 
    } 
} 
public class MyClass { } 

Sólo funciona sin ningún problema. Si la clase correspondiente implementa IDisposable lo llamará, si no, todavía funcionará/ejecutará :).

Actualización: Como han dicho otros, también me pregunto cuál es el uso que le quieres dar. Supongo que tiene algo así como una fábrica que puede obtener instancias de diferentes clases, que pueden ser desechables o no :).

1

Si "¿funcionará?" ¿Quiere decir que obtendrá un error de tiempo de ejecución? No, no lo harás

1

¿De qué sirve esto? ¿Cuál es la ventaja? ¿Cuál es el beneficio?

La sentencia using se asegurará de que se llame al método Dispose, pero si su objeto no implementa IDisposable, no veo el uso de hacer esto? Funcionará (como en, no lanzará excepciones de tiempo de ejecución y se compilará), acabo de probarlo aquí, pero ...

Con el código que ha anotado, no puede ni siquiera hacer uso del recurso como un IDisposable ...

+0

@Frederik agregado a mi respuesta: supongo que es una fábrica que puede obtener instancias de diferentes clases que pueden ser desechables o no. – eglasius

16

Sí. Una declaración using comprueba si se está dando null y evita intentar llamar al Dispose si es así.

Desde la sección 8.13 de la especificación C# 3:

Una declaración usando se traduce en tres partes: la adquisición, uso y disposición . El uso del recurso es incluido implícitamente en una instrucción try que incluye una cláusula finally. Esta cláusula finally dispone del recurso . Si se adquiere un recurso nulo , no se realiza ninguna llamada a Dispose y se produce ninguna excepción.

2

Debería funcionar bien, incluso si no es el enfoque "correcto" para deshacerse de los recursos. La DECLARACIÓN using es sólo azúcar sintáctica para

IDisposable o = ...; 

try 
{ 
    // ... 
} 
finally 
{ 
    if (o != null) 
    o.Dispose(true); 
} 

Así que si o no implementado IDisposable sería nula en el estado using y que trataría de llamar Dispose en él.

+0

@Samuel agregado a mi respuesta: supongo que es una fábrica que puede obtener instancias de diferentes clases que pueden ser desechables o no. – eglasius

2

Al probar el código, parece que no produce errores de compilación o de tiempo de ejecución.

De la definición del idioma (ver sección 8.13): -

Si se adquiere un recurso nulo, se realiza ninguna llamada dejar de tener, y sin excepción.

Si el tipo no se puede convertir en IDisposible el operador as de recursos se traducirá en nulo, y el código encapsulado en el uso de bloques ejecutará perfectamente bien, se comporta exactamente igual que si no hubiera cerrado en el usando bloque.

En resumen, la respuesta a su pregunta es sí.

1

Puede ser útil cuando el tipo implementa explícitamente IDisposable, en cuyo caso el método Dispose no es accesible directamente en el tipo a menos que el tipo se transfiera a un IDisposable, usando 'as' hace un yeso seguro y asegura que Dispose es llamado. En la mayoría de los casos, cuando el tipo implementa explícitamente IDisposable, proporciona métodos como 'Cerrar' que a su vez llama a Dispose

Cuestiones relacionadas