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. Libros sobre criptografía desde muy básico hasta muy avanzado
- 4. Ruby on Rails básico Pregunta sobre el enrutamiento
- 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 representar mejor un icono de superposición sobre el ícono básico del nodo Delirtual TVirtualTreeView
- 15. Asesoramiento sobre qué idioma usar
- 16. Cómo usar XMPP sobre BOSH
- 17. Falta JavaDoc básico en Eclipse
- 18. Uso básico BackgroundWorker con parámetros
- 19. Aprendizaje automático básico
- 20. básico jUnit Preguntas
- 21. MSIL Pregunta (básico)
- 22. Ejemplo básico de pySQLite?
- 23. importaciones básico Python cuestionar
- 24. MVT básico en Django
- 25. Cifrado básico en Android
- 26. Histograma básico en JFreeChart
- 27. básico "crudo" Ajax llamada
- 28. básico de Java tarea
- 29. Flujo básico de Struts
- 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