Si utilizo la construcción "using", sé que el objeto se elimina automáticamente. ¿Qué sucede si una declaración dentro de un constructo "using" genera una excepción? ¿El objeto "usar" todavía está dispuesto? ¿Si es así cuando?básico sobre "usar" construcción
Respuesta
Un bloque using
es convertido - por el compilador - a esto:
DisposableType yourObj = new DisposableType();
try
{
//contents of using block
}
finally
{
((IDisposable)yourObj).Dispose();
}
Al poner la llamada Dispose()
en el bloque finally
, asegura Dispose
es siempre llamada - a menos que, por supuesto, la excepción se produce en el sitio de creación de instancias, ya que eso ocurre fuera del try
.
Es importante recordar que using
no es un tipo especial de operador o constructo, es algo que el compilador reemplaza con algo más obtuso.
This article explains it nicely.
Internamente, este chico malo genera un/finalmente alrededor del objeto tratar de ser asignado y pide a Dispose() para usted. Le ahorra la molestia de crear manualmente el bloque try/finally y llamar a Dispose().
Actualmente el uso del bloque es Equivalente para probar - finalmente bloquear, lo que garantiza que finalmente siempre se ejecutará, p.
using (SqlConnection con = new SqlConnection(ConnectionString))
{
using (SqlCommand cmd = new SqlCommand("Command", con))
{
con.Open();
cmd.ExecuteNonQuery();
}
}
igual a
SqlConnection con = null;
SqlCommand cmd = null;
try
{
con = new SqlConnection(ConnectionString);
cmd = new SqlCommand("Command", con);
con.Open();
cmd.ExecuteNonQuery();
}
finally
{
if (null != cmd);
cmd.Dispose();
if (null != con)
con.Dispose();
}
- 1. Preguntas sobre el certificado SSL básico
- 2. Iterando sobre el bucle "for" básico usando Handlebars.js
- 3. Ruby on Rails básico Pregunta sobre el enrutamiento
- 4. Libros sobre criptografía desde muy básico hasta muy avanzado
- 5. Usar% s en C correctamente - nivel muy básico
- 6. Enhebrado básico
- 7. JPA: ¿Qué debería usar? Básico (opcional) o Columna (nulable)? Para
- 8. Escribiendo un depurador muy básico
- 9. Uso básico de Waypoint
- 10. uso básico multi-GPU
- 11. PHP básico y AJAX
- 12. Tipo básico inferral
- 13. ¿Algún tutorial sobre cómo usar phpDocumentor?
- 14. Cómo usar XMPP sobre BOSH
- 15. Asesoramiento sobre qué idioma usar
- 16. Cómo representar mejor un icono de superposición sobre el ícono básico del nodo Delirtual TVirtualTreeView
- 17. Falta JavaDoc básico en Eclipse
- 18. Uso básico BackgroundWorker con parámetros
- 19. MVT básico en Django
- 20. MSIL Pregunta (básico)
- 21. básico de Java tarea
- 22. Cifrado básico en Android
- 23. Histograma básico en JFreeChart
- 24. importaciones básico Python cuestionar
- 25. básico jUnit Preguntas
- 26. Ejemplo básico de pySQLite?
- 27. básico "crudo" Ajax llamada
- 28. Flujo básico de Struts
- 29. Aprendizaje automático básico
- 30. Cómo usar Hudson en la construcción de múltiples plataformas
También es importante señalar que, como su ejemplo ilustra, si la llamada a DisposableType() lanza una excepción, no será llamado a Dispose(); los recursos asignados allí antes de la excepción no se liberarán. – Ben
@Ben muy cierto. Lo señalaré explícitamente. –
También hay una prueba 'null' en el bloque' finally'. – Ani