2012-03-02 18 views
5

cuál es mejor de las siguientes opcionesC# utilizando la palabra clave, el uso adecuado de él

¿Es suficiente una instrucción using?

Opción 1:

using(SqlConnection con = new SqlConnection(constring)) 
{ 
    using(SqlCommand cmd = new SqlCommand()) 
    { 
     ......................... 
     ......................... 
     ......................... 
    } 
} 

Opción 2:

using(SqlConnection con = new SqlConnection(constring)) 
{ 
    SqlCommand cmd = new SqlCommand(); 
    ......................... 
    ......................... 
    ......................... 
} 
+0

posible duplicado de [Es SqlCommand.Dispose() si es necesario se dispondrá SqlConnection asociado?] (Http://stackoverflow.com/questions/1808036/is-sqlcommand-dispose-required-if-associated- sqlconnection-will-be-disposed) –

Respuesta

15

Por lo general es más sencilla de seguir la regla: "Si el tipo implementa IDisposable a continuación, utilizar una construcción using." Así que iría con algún tipo de opción 1.

1

No, no es suficiente, como regla general, encerrar en un bloque de uso cada vez que instancia un IDisposable.

1

Es mejor usar dos comandos de uso (aunque hay alternative syntaxes) cuando tiene múltiples. Es mejor que la recolección de basura sea explícita sobre cuándo desea acceder a esos recursos.

+0

¿Qué le hace pensar 'IDisposable' o' using (...) 'tener algo que ver con el recolector de basura? – asawyer

+2

@asawyer en ambos casos estamos lidiando con borrar la memoria, supongo. – Mubarek

2

El primero es definitivamente mejor.

Incluso cuando existe una relación entre Conexión y Comando que hace que la externa sea suficiente, no se debe confiar en eso, o esperar que sus lectores lo sepan.

Y tales relaciones nunca se documentan y pueden cambiar en futuras versiones.

+0

¿Podría aclarar 'Incluso cuando exista una relación entre Conexión y Comando'. Gracias – Mubarek

+0

El comando necesita la conexión, cuando cierras la conexión, nunca mantienes los recursos en el servidor. Aunque la agrupación de conexiones podría hacerlo menos claro. También vea TextReader y Stream. –

9

Tienes que envolverlos a ambos, aunque puedes hacerlo lucir un poco más limpio si eso te molesta.

using (var conn = new SqlConnection(/* ... */)) 
using (var cmd = new SqlCommand(/* ... */)) 
{ 
    // ... 
}