¿Qué es el bloque de uso de C# y por qué debería usarlo? [duplicar]


Esta pregunta ya tiene una respuesta aquí:

¿Cuál es el propósito del bloque Using en C#? ¿En qué se diferencia de una variable local?

Author: one noa, 2008-10-17

9 answers

Si el tipo implementa IDisposable, automáticamente se dispone de ella.

Dado:

public class SomeDisposableType : IDisposable
{
   ...implmentation details...
}

Estos son equivalentes:

SomeDisposableType t = new SomeDisposableType();
try {
    OperateOnType(t);
}
finally {
   t.Dispose();
}

using (SomeDisposableType u = new SomeDisposableType()) {
    OperateOnType(u);
}

El segundo es más fácil de leer y mantener.

 245
Author: plinth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-22 09:50:41

Using llama a Dispose() después de dejar el bloque using, incluso si el código lanza una excepción.

Así que normalmente usas using para clases que requieren limpieza después de ellas, como IO.

Entonces, esto usando el bloque:

using (MyClass mine = new MyClass())
{
  mine.Action();
}

Haría lo mismo que:

MyClass mine = new MyClass();
try
{
  mine.Action();
}
finally
{
  if (mine != null)
    mine.Dispose();
}

Usar using es mucho más corto y fácil de leer.

 88
Author: Sam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-13 21:33:00

De MSDN:

C#, a través del. NET Framework común tiempo de ejecución del idioma (CLR), automáticamente libera la memoria utilizada para almacenar objetos que ya no son necesarios. La liberación de la memoria es no determinista; se libera la memoria cada vez que el CLR decide realizar recolección de basura. Sin embargo, es lo mejor de liberación limitada recursos tales como manejadores de archivos y conexiones de red tan rápido como posible.

La instrucción using permite programador para especificar cuándo objetos que los recursos de uso deben liberar ellos. El objeto proporcionado al usuario declaración debe implementar el Interfaz IDisposable. Esta interfaz proporciona el método de Eliminación, que debe liberar los recursos del objeto.

En otras palabras, la instrucción using le dice a.NET que libere el objeto especificado en el bloque using una vez que ya no sea necesario.

 38
Author: Robert S.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-17 13:53:41

La instrucción using se usa para trabajar con un objeto en C# que implementa la interfaz IDisposable.

La interfaz IDisposable tiene un método público llamado Dispose que se utiliza para deshacerse del objeto. Cuando usamos la instrucción using, no necesitamos disponer explícitamente del objeto en el código, la instrucción using se encarga de él.

using (SqlConnection conn = new SqlConnection())
{

}

Cuando usamos el bloque anterior, internamente el código se genera así:

SqlConnection conn = new SqlConnection() 
try
{

}
finally
{
    // calls the dispose method of the conn object
}

Para más detalles lea: Entendiendo la instrucción 'using' en C # .

 19
Author: Sunquick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-08 20:09:22

Colocar código en un bloque de uso asegura que los objetos sean eliminados (aunque no necesariamente recogidos) tan pronto como control abandona el bloque.

 5
Author: TheSmurf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-17 13:51:03

También tenga en cuenta que el objeto instanciado a través de using es de solo lectura dentro del bloque using. Consulte la referencia oficial de C# aquí.

 5
Author: Sir Juice,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-28 12:46:57
using (B a = new B())
{
   DoSomethingWith(a);
}

Es equivalente a

B a = new B();
try
{
  DoSomethingWith(a);
}
finally
{
   ((IDisposable)a).Dispose();
}
 4
Author: Bert Huijben,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-29 14:33:14

En realidad es solo un poco de azúcar sintática que no requiere que se llame explícitamente a Dispose en los miembros que implementan IDesposable.

 2
Author: SaaS Developer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-17 13:53:44

La instrucción using obtiene uno o más recursos, ejecuta una instrucción y luego se deshace del recurso.

 2
Author: Meera Tolia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-05 06:45:47