Using (Instrucción, Visual Basic)

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

Using { resourcelist | resourceexpression }
    [ statements ]
End Using

Elementos

Término

Definición

resourcelist

Obligatorio si no se proporciona una expresión resourceexpression. Lista de uno o más recursos del sistema que controles de este bloque Using , separados por comas.

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

Requerido. 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

Término

Definición

resourcename

Requerido. 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

Requerido. 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 (Visual Basic).

resourceexpression

Requerido. 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 (GC) de .NET Framework sin necesidad de código adicional por su parte. Para los recursos administrados no es necesario utilizar ningún bloque Using. Sin embargo, todavía puede utilizar un bloque Using para forzar la eliminación de un recurso administrado en lugar de esperar al recolector de elementos no utilizados.

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 al objeto finalizar limpiamente sus recursos. 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.

Si resourcename es Nothing, no se realiza ninguna llamada a Dispose , y no se produce ninguna excepción.

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

' For the acquisition and disposal of resource, the following
' Try construction is equivalent to the Using block.
Dim resource As New resourceType
Try 
    ' Insert code to work with resource.
Finally 
    If resource IsNot Nothing Then
        resource.Dispose() 
    End If
End Try 
NotaNota

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 se crea un archivo denominado log.txt y escribe dos líneas de texto al archivo. El ejemplo lee también que el mismo archivo y muestra las líneas de texto.

Dado que las clases TextWriter y TextReader implementan la interfaz IDisposable , el código puede utilizar las instrucciones Using para asegurarse de que el archivo correctamente se cierra después de escribir y de las operaciones de lectura.

Private Sub WriteFile()
    Using writer As System.IO.TextWriter = System.IO.File.CreateText("log.txt")
        writer.WriteLine("This is line one.")
        writer.WriteLine("This is line two.")
    End Using 
End Sub 

Private Sub ReadFile()
    Using reader As System.IO.TextReader = System.IO.File.OpenText("log.txt")
        Dim line As String

        line = reader.ReadLine()
        Do Until line Is Nothing
            Console.WriteLine(line)
            line = reader.ReadLine()
        Loop 
    End Using 
End Sub

Vea también

Tareas

Cómo: Deshacerse de un recurso del sistema (Visual Basic)

Referencia

IDisposable

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