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

Resuelto Ryan Michela asked hace 16 años • 9 respuestas

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

Ryan Michela avatar Oct 17 '08 20:10 Ryan Michela
Aceptado

Si el tipo implementa IDisposable, elimina automáticamente ese tipo.

Dado:

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

Estos son equivalentes:

SomeDisposableType t = new SomeDisposableType();
try {
    OperateOnType(t);
}
finally {
    if (t != null) {
        ((IDisposable)t).Dispose();
    }
}
using (SomeDisposableType u = new SomeDisposableType()) {
    OperateOnType(u);
}

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


Desde C# 8 hay una nueva sintaxisusing que puede hacer que el código sea más legible:

using var x = new SomeDisposableType();

No tiene un { }bloque propio y el alcance del uso es desde el punto de declaración hasta el final del bloque en el que se declara. Esto significa que puedes evitar cosas como:

string x = null;
using(var someReader = ...)
{
  x = someReader.Read();
}

Y tienes esto:

using var someReader = ...;
string x = someReader.Read();
plinth avatar Oct 17 '2008 13:10 plinth

Usingllamadas Dispose()después usingde abandonar el bloque, incluso si el código genera una excepción.

Por lo general, se usa usingpara clases que requieren limpieza después de ellas, como IO.

Entonces, este 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 usinges mucho más corto y más fácil de leer.

Sam avatar Oct 17 '2008 13:10 Sam

Desde MSDN:

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

La declaración de uso permite al programador especificar cuándo los objetos que usan recursos deben liberarlos. El objeto proporcionado a la declaración de uso debe implementar la interfaz IDisposable. Esta interfaz proporciona el método Dispose, que debería liberar los recursos del objeto.

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

Robert S. avatar Oct 17 '2008 13:10 Robert S.

La declaración de uso se utiliza para trabajar con un objeto en C# que implementa la IDisposableinterfaz.

La IDisposableinterfaz tiene un método público llamado Disposeque se utiliza para deshacerse del objeto. Cuando usamos la declaración de uso, no necesitamos eliminar explícitamente el objeto en el código, la declaración de uso se encarga de ello.

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 obtener más detalles, lea: Comprensión de la declaración 'using' en C# .

Sunquick avatar Jan 13 '2012 00:01 Sunquick