¿Cuál es el propósito de la declaración de uso?
-
24-12-2019 - |
Pregunta
En base a lo escrito en este Página web, y si entiendo correctamente, el using
declaración funciona como un try/finally
, por lo que podría esperar erróneamente que si ocurre una excepción en un using
declaración, no debería bloquear el programa.
Sin embargo, cuando el DownloadString
método, que se muestra en el siguiente ejemplo, arroja un WebException
, el programa falla.
using (WebClient client = new WebClient())
{
string response = client.DownloadString(url);
// ...
}
Esto es normal, ya que el using
La declaración no funciona como una try/catch/finally
, entonces en realidad no se maneja ninguna excepción.Pero luego me pregunto cuál es el propósito de la using
declaración.
ACTUALIZAR... Con base en las respuestas a continuación, agrego las siguientes consideraciones.Básicamente, si necesito manejar una excepción, las posibles soluciones podrían ser las siguientes.
- Pon el
using
declaración dentro de untry/catch
bloquear. - Pon solo el
DonwloadString
método dentro de untry/catch
bloquear. - Escriba manualmente un bloque try/catch/finally como en el siguiente ejemplo de código.
Código de muestra para la tercera solución.
WebClient client = new WebClient();
try
{
string response = client.DownloadString(url);
// ...
}
catch(Exception ex)
{
// handle (or ignore) the exception
}
finally
{
if (client != null)
client.Dispose();
}
Solución
Si entiendo correctamente, la declaración de uso funciona como un intento/finalmente
Correcto.
por lo que esperaría que si ocurre una excepción en una declaración de uso, no bloquee el programa.
Incorrecto.
Ni try/finally
ni using
Las declaraciones tragan excepciones: si no detecta la excepción, se propagará hacia arriba.Si no se detecta, normalmente finalizará el proceso.(Hay algunos casos en los que no lo hará, según en qué subproceso se encuentre y cómo esté configurado CLR, pero ese es un asunto diferente).
Pero luego me pregunto cuál es el propósito de la declaración de uso.
Para simplificar la escritura de código que necesita disponer de recursos.Eso es todo.Si no tuviéramos using
declaraciones, tendríamos un lote de try
/finally
bloques que acaban de llamar Dispose
...y eso sería considerablemente más feo.(He estado allí, lo he hecho; eso era Java hasta que Java 7 introdujo la declaración de prueba con recursos).
Otros consejos
A using
declaración no hace que todas las excepciones desaparezcan mágicamente, sólo significa que IDisposable.Dispose
El método se llama correctamente en el client
objetar si esto ocurre.Esto es importante para garantizar que se liberen los recursos no administrados.
Volverá a generar cualquier excepción que ocurra y aún tendrás que manejarla en tu propio código.
Consulte MSDN Descripción de la Declaración de using
En resumen, el uso de garantiza que se llama .Dispose()
incluso si se produce una excepción.Sin embargo, no es detener la excepción de hacerlo.
La instrucción Uso no tiene una captura, solo una finalmente y, por lo tanto, dispone del recurso para usted.Si la declaración de uso debía tomar todas las excepciones y continuar funcionando, sería un gran obstáculo para la depuración.
Es simplemente más fácil y más rápido para usar y leer
ver por ti mismo
var myVar = null
try
{
my = new Object();
//Do stuff
}
finally
{
if(myVar != null)
myVar.Dispose()
}
vs
using(var myVar = new Object())
{
//Do stuff
}
Simplemente para asegurarse de que el dispondrá en ese objeto.El usando no hagas ningún manejo de excepciones como intento / finalmente, ya sea