Cúal:
using (var myObject = new MyClass())
{
   try
   {
      // something here...
   }
   catch(Exception ex)
   {
      // Handle exception
   }
}O
try
{
   using (var myObject = new MyClass())
   {
      // something here...
   }
}
catch(Exception ex)
{
   // Handle exception
}
                    
                        c#
                                try-catch
                                using-statement
                                
                    
                    
                        Xaqron
fuente
                
                fuente

}de lausingdeclaración puede arrojar una excepción como se recuerda aquí .finallyllame al método de eliminación.Respuestas:
Prefiero el segundo. También puede atrapar errores relacionados con la creación del objeto.
fuente
trybloque, lo que le permite mostrar un mensaje de error si algo falla, el programa ahora tiene la capacidad de recuperarse e informar al usuario.using( DBConnection conn = DBFactory.getConnection())que debería revertirse en caso de que ocurriera una excepción. Me parece que ambos tienen su lugar.Dado que un bloque de uso es solo una simplificación de sintaxis de un intento / finalmente ( MSDN ), personalmente iría con lo siguiente, aunque dudo que sea significativamente diferente a su segunda opción:
fuente
finallyes preferible agregar un bloque a lausingdeclaración?finallybloque que disponga de un objeto IDisposable es lo que hace unausinginstrucción. Personalmente, me gusta esto en lugar delusingbloque incrustado porque creo que establece más claramente dónde está sucediendo todo, y que todo está en el mismo "nivel". También me gusta más que variosusingbloques incrustados ... pero todo es solo mi preferencia.trydeclaración para que se elimine dentro de lafinallydeclaración; de lo contrario, arrojará un error de compilación: "Uso de la variable local no asignada 'myObject'"Cannot assign null to implicitly-typed local variable;) Pero sé lo que quieres decir y personalmente preferiría esto a anidar un bloque de uso.Depende. Si está utilizando Windows Communication Foundation (WCF),
using(...) { try... }no funcionará correctamente si el proxy en lausingdeclaración está en estado de excepción, es decir, eliminar este proxy causará otra excepción.Personalmente, creo en un enfoque de manejo mínimo, es decir, manejar solo una excepción que conozca en el punto de ejecución. En otras palabras, si sabe que la inicialización de una variable
usingpuede generar una excepción en particular, la envolverétry-catch. Del mismo modo, si dentro delusingcuerpo puede suceder algo, que no está directamente relacionado con la variableusing, entonces lo envuelvo con otrotrypara esa excepción en particular. Raramente usoExceptionen micatches.Pero sí me gusta
IDisposabley,usingaunque quizás sea parcial.fuente
Si su declaración catch necesita acceder a la variable declarada en una declaración using, entonces dentro es su única opción.
Si su declaración catch necesita el objeto al que se hace referencia antes de desecharlo, entonces su única opción es dentro.
Si su declaración catch toma una acción de duración desconocida, como mostrar un mensaje al usuario, y desea deshacerse de sus recursos antes de que eso suceda, entonces afuera es su mejor opción.
Cada vez que tengo un escenario similar a este, el bloque try-catch generalmente está en un método diferente más arriba de la pila de llamadas que el uso. No es típico que un método sepa cómo manejar excepciones que ocurren dentro de él de esta manera.
Así que mi recomendación general es afuera, muy afuera.
fuente
Ambos son sintaxis válida. Realmente se reduce a lo que desea hacer: si desea detectar errores relacionados con la creación / eliminación del objeto, use el segundo. Si no, usa el primero.
fuente
Hay una cosa importante que llamaré aquí: la primera no detectará ninguna excepción derivada de llamar al
MyClassconstructor.fuente
Desde C # 8.0, prefiero usar el segundo igual así
y entonces
fuente
Si el objeto que está inicializando en el bloque Using () podría arrojar alguna excepción, entonces debería optar por la segunda sintaxis, de lo contrario, ambas serían igualmente válidas.
En mi escenario, tuve que abrir un archivo y estaba pasando filePath en el constructor del objeto que estaba inicializando en el bloque Using () y podría arrojar una excepción si filePath está incorrecto / vacío. Entonces, en este caso, la segunda sintaxis tiene sentido.
Mi código de muestra: -
fuente
A partir de C # 8.0 , puede simplificar las
usingdeclaraciones en algunas condiciones para deshacerse del bloque anidado, y luego solo se aplica al bloque que lo encierra.Entonces sus dos ejemplos se pueden reducir a:
Y:
Ambos son bastante claros; y luego eso reduce la elección entre los dos a una cuestión de lo que quiere que sea el alcance del objeto, dónde desea manejar los errores de instanciación y cuándo desea deshacerse de él.
fuente