Instrucción Using (Visual Basic)

Actualización: noviembre 2007

Declara el principio de un bloque Using y, opcionalmente, adquiere los recursos del sistema que controla el bloque.

Using { resourcelist | resourceexpression }
    [ statements ]
End Using

Partes

  • resourcelist
    Obligatorio si no se proporciona una expresión resourceexpression. Presenta una lista de uno o más recursos del sistema que controla este bloque Using.

  • resourceexpression
    Obligatorio si no se proporciona una resourcelist. Variable de referencia o expresión que hace referencia a un recurso del sistema que va a controlar este bloque Using.

  • statements
    Opcional. Bloque de instrucciones que ejecuta el bloque Using.

  • End Using
    Obligatorio. Finaliza la definición del bloque Using y desecha todos los recursos que controla.

Cada recurso incluido en la parte resourcelist tiene la siguiente sintaxis y partes:

resourcename As New resourcetype [ ( [ arglist ] ) ]

O bien,

resourcename As resourcetype = resourceexpression

Partes de resourcelist

  • resourcename
    Obligatorio. Variable de referencia que hace referencia a un recurso del sistema que controla el bloque Using.

  • New
    Obligatorio si la instrucción Using adquiere el recurso. Si ya ha adquirido el recurso, utilice la segunda alternativa de la sintaxis.

  • resourcetype
    Obligatorio. Clase del recurso. La clase debe implementar la interfaz IDisposable.

  • arglist
    Opcional. Lista de argumentos que está pasando al constructor para crear una instancia de resourcetype. Vea Lista de parámetros.

  • resourceexpression
    Obligatorio. Variable o expresión que hace referencia a un recurso del sistema que satisface los requisitos de resourcetype. Si utiliza la segunda alternativa de la sintaxis, debe adquirir el recurso antes de pasar el control a la instrucción Using.

Comentarios

A veces su código requiere un recurso no administrado, como un identificador de archivos, un contenedor COM o una conexión SQL. Un bloque Using garantiza la eliminación de uno o más de tales recursos cuando su código termina de usarlos. Esto los pone a disposición de otro código para que los pueda utilizar.

Los recursos administrados se eliminan mediante el recolector de elementos no utilizados de .NET Framework sin necesidad de código adicional por su parte. Para los recursos administrados no es necesario utilizar ningún bloque Using.

Un bloque Using tiene tres partes: adquisición, uso y eliminación.

  • Adquisición significa crear una variable e inicializarla para hacer referencia al recurso del sistema. La instrucción Using puede adquirir uno o más recursos, o bien, puede adquirir exactamente un recurso antes de entrar en el bloque y proporcionarlo a la instrucción Using. Si proporciona una resourceexpression, debe adquirir el recurso antes de pasar el control a la instrucción Using.

  • Uso significa tener acceso a los recursos y realizar acciones con ellos. Las instrucciones entre Using y End Using representan el uso de los recursos.

  • Eliminación significa llamar al método Dispose en el objeto de resourcename. Esto permite el objeto terminar limpiamente su recurso no administrado. La instrucción End Using elimina los recursos bajo el control del bloque Using.

Comportamiento

Un bloque Using se comporta como una construcción Try...Finally en la que el bloque Try utiliza los recursos y el bloque Finally los desecha. Gracias a esto, el bloque Using garantiza la eliminación de los recursos, independientemente de cómo salga del bloque. Esto es cierto incluso en el caso de una excepción no controlada, excepto para una excepción StackOverflowException.

El ámbito de cada variable de recurso adquirido por la instrucción Using se limita al bloque Using.

Si especifica más de un recurso de sistema en la instrucción Using, el efecto es el mismo que si anidara unos bloques Using dentro de otros.

Control de excepción estructurada dentro de un bloque Using

Si necesita controlar una excepción que podría aparecer dentro del bloque Using, puede agregarle una construcción Try...Finally. Si necesita controlar el caso en el que la instrucción Using no consigue adquirir un recurso, puede comprobar si resourcename es Nothing.

Control de excepción estructurada en lugar de un bloque Using

Si necesita un control más preciso sobre la adquisición de los recursos, o si necesita código adicional en el bloque Finally, puede volver a escribir el bloque Using como una construcción Try...Finally. El ejemplo siguiente muestra una estructura Try y construcciones Using que son equivalentes en la adquisición y eliminación de resource.

Using resource As New resourceType 
    ' Insert code to work with resource.
End Using
' THE FOLLOWING TRY CONSTRUCTION IS EQUIVALENT TO THE USING BLOCK
Dim resource As New resourceType
Try 
    ' Insert code to work with resource.
Catch ex As Exception
    ' Insert code to process exception.
Finally 
    ' Insert code to do additional processing before disposing of resource.
    resource.Dispose()End Try
Nota:

El código situado dentro del bloque Using no debería asignar a otra variable el objeto de resourcename. Cuando sale del bloque Using, se elimina el recurso y la otra variable no puede tener acceso al recurso al que señala.

Ejemplo

El ejemplo siguiente utiliza un bloque Using para adquirir una nueva fuente. Esto garantiza que el sistema llama al método Dispose de la fuente cuando su código sale del bloque.

Public Sub setbigbold(ByVal c As Control)
    Using nf As New System.Drawing.Font("Arial", 12.0F, _
        System.Drawing.FontStyle.Bold)

        c.Font = nf
        c.Text = "This is 12-point Arial bold"
    End Using
End Sub

Vea también

Tareas

Cómo: Deshacerse de un recurso del sistema

Referencia

IDisposable

Instrucción Try...Catch...Finally (Visual Basic)

System.Drawing

Font