Pregunta

Normalmente uso un código como este:

using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConn"].ConnectionString))
{
   var command = connection.CreateCommand();
   command.CommandText = "...";
   connection.Open();
   command.ExecuteNonQuery();
}

¿Se eliminará automáticamente mi comando ? ¿O no y tengo que envolverlo en utilizando el bloque ? ¿Es necesario eliminar SqlCommand ?

¿Fue útil?

Solución

Solo haz esto:

using(var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConn"].ConnectionString))
using(var command = connection.CreateCommand())
{
   command.CommandText = "...";
   connection.Open();
   command.ExecuteNonQuery();
}

No llamar a desechar en el comando no hará nada tan malo. Sin embargo, llamar a Dispose en él suprimirá la llamada al finalizador , haciendo que las llamadas dispongan de una mejora de rendimiento.

Otros consejos

La política más segura es llamar siempre a Dispose () en un objeto si implementa IDisposable , ya sea explícitamente o mediante un bloque de uso. Puede haber casos en los que no sea necesario, pero llamarlo de todos modos nunca debería causar problemas (si la clase está escrita correctamente). Además, nunca se sabe cuándo puede cambiar una implementación, lo que significa que donde no se requería la llamada anteriormente, ahora es definitivamente necesario.

En el ejemplo que has dado, puedes agregar un bloque de uso interno adicional para el comando, así como mantener el bloque de uso externo para la conexión.

Sí, debería, incluso si la implementación actualmente no está haciendo mucho, no sabe cómo se va a cambiar en el futuro (por ejemplo, las versiones más recientes del marco). En general, debe eliminar todos los objetos que implementan IDisposable para estar en el lado seguro.

Sin embargo, si la operación se aplaza y no controlas el alcance completo (por ejemplo, cuando trabajas de forma asíncrona, o cuando devuelves un SqlDataReader o algo así), puedes establecer el CommandBehavior a CloseConnection para que, tan pronto como el lector haya terminado, la conexión esté debidamente cerrada / dispuesta por usted.

Puede averiguar este tipo de cosas utilizando Reflector o dotPeek o < a href = "https://referencesource.microsoft.com/" rel = "nofollow noreferrer"> https://referencesource.microsoft.com/ .

Tuve una pequeña excavación (sugeriría que te cavases para estar completamente seguro del resto de esto, ya que no me esforcé tanto) y parece que cuando matas una conexión no hay eliminación de Cualquier niño asociado con esa conexión. Además, en realidad no parece que la eliminación de un comando realmente haga eso. Establecerá un campo como nulo, se separará de un contenedor (esto puede evitar una pérdida de memoria administrada) y generará un evento (esto podría ser importante, pero no puedo ver quién está escuchando este evento).

De cualquier manera, es una buena práctica usar estas cosas en un bloque de uso o asegurarte de desecharlas usando un patrón de disposición en el objeto que mantiene la conexión (si tienes intención de mantener el comando por un tiempo).

En la práctica, puede omitir Dispose . No libera ningún recurso. Ni siquiera suprime la finalización ya que SQLCommand constructor lo hace .

En teoría, Microsoft podría cambiar la implementación para mantener un recurso no administrado, pero espero que salgan con una API que elimine la clase base Component mucho antes de que lo hagan. que.

En mi opinión, llamar a Dispose para SqlConnection y SqlCommand es una buena práctica, utilice el código a continuación

using(var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConn"].ConnectionString))
try{
    using(var command = connection.CreateCommand())
    {
       command.CommandText = "...";
       connection.Open();
       command.ExecuteNonQuery();
    }
}
catch(Exception ex){ //Log exception according to your own way
    throw;
}
finally{
    command.Dispose();
    connection.Close();
    connection.Dispose();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top