Compartir a través de


using (Instrucción, Referencia de C#)

Actualización: Julio de 2008

Proporciona una sintaxis adecuada que garantiza el uso correcto de los objetos IDisposable.

Ejemplo

El ejemplo siguiente muestra cómo utilizar la instrucción using.

using (System.IO.StreamReader sr = new System.IO.StreamReader(@"C:\Users\Public\Documents\test.txt"))
{
    string s = null;
    while((s = sr.ReadLine()) != null)
    {
        Console.WriteLine(s);
    }
}

Comentarios

File y Font son ejemplos de tipos administrados que obtienen acceso a recursos no administrados (en este caso, identificadores de archivo y contextos de dispositivo). Existen muchos más tipos de recursos no administrados y tipos de biblioteca de clases que los encapsulan. Todos estos tipos deben implementar la interfaz IDisposable.

Como norma, cuando utilice un objeto IDisposable, declárelo y cree instancias del mismo en una instrucción using. La instrucción using llama al método Dispose en el objeto de la forma correcta y, si se utiliza tal y como se ha explicado anteriormente, también hace que el propio objeto salga del ámbito en cuanto se llama a Dispose. Dentro del bloque using, el objeto es de sólo lectura y no puede modificarse ni reasignarse.

La instrucción using garantiza que se llame a Dispose, aunque se produzca una excepción mientras se llama a los métodos del objeto. Puede conseguir el mismo resultado colocando el objeto dentro de un bloque try y llamando a continuación a Dispose en un bloque finally; de hecho, esta es la forma en que el compilador traduce la instrucción using. El ejemplo de código anterior se extiende al siguiente código en tiempo de compilación (tenga en cuenta las llaves adicionales para crear el ámbito limitado del objeto):

{
  Font font1 = new Font("Arial", 10.0f);
  try
  {
    byte charset = font1.GdiCharSet;
  }
  finally
  {
    if (font1 != null)
      ((IDisposable)font1).Dispose();
  }
}

Pueden utilizarse varios objetos con una instrucción using, pero deben declararse dentro de la instrucción using, como en el ejemplo siguiente:

using (Font font3 = new Font("Arial", 10.0f),
            font4 = new Font("Arial", 10.0f))
{
    // Use font3 and font4.
}

Puede crear instancias del objeto de recursos y, a continuación, pasar la variable a la instrucción using, pero no es un procedimiento recomendado. En este caso, el objeto permanece en el ámbito después de que el control abandone el bloque using, aunque es probable que ya no tenga acceso a sus recursos no administrados. En otras palabras, ya no se inicializará completamente. Si intenta utilizar el objeto fuera del bloque using, se arriesga a que se inicie una excepción. Por esta razón, suele ser mejor crear instancias del objeto en la instrucción using y limitar su ámbito al bloque using.

Font font2 = new Font("Arial", 10.0f);
using (font2) // not recommended
{
    // use font2
}
// font2 is still in scope
// but the method call throws an exception
float f = font2.GetHeight(); 


Especificación del lenguaje C#

Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.

  • 5.3.3.17 Instrucciones Using

  • 8.13 La instrucción using

Vea también

Conceptos

Guía de programación de C#

Implementar un método Dispose

Referencia

Palabras clave de C#

using (Directiva, Referencia de C#)

Implementar Finalize y Dispose para limpiar recursos no administrados

Otros recursos

Referencia de C#

Recolección de elementos no utilizados

Historial de cambios

Fecha

Historial

Motivo

Julio de 2008

Se ha agregado un ejemplo de código después de la introducción.

Corrección de errores de contenido.