Compartir a través de


Instrucción Using (Visual Basic)

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

Sintaxis

Using { resourcelist | resourceexpression }
    [ statements ]
End Using

Partes

Término Definición
resourcelist Obligatorio si no proporciona resourceexpression. Lista de uno o más recursos del sistema que controla este Using bloque, separados por comas.
resourceexpression Obligatorio si no proporciona resourcelist. Variable o expresión de referencia que hace referencia a un recurso del sistema que va a controlar este Using bloque.
statements Opcional. Bloque de instrucciones que ejecuta el Using bloque.
End Using Obligatorio. Finaliza la definición del Using bloque y elimina todos los recursos que controla.

Cada recurso de la resourcelist parte tiene la siguiente sintaxis y partes:

resourcename As New resourcetype [ ( [ arglist ] ) ]

-o-

resourcename As resourcetype = resourceexpression

elementos resourcelist

Término Definición
resourcename Obligatorio. Variable de referencia que hace referencia a un recurso del sistema que controla el Using bloque.
New Obligatorio si la Using instrucción adquiere el recurso. Si ya ha adquirido el recurso, use la segunda alternativa de sintaxis.
resourcetype Obligatorio. Clase del recurso. La clase debe implementar la IDisposable interfaz .
arglist Opcional. Lista de argumentos que va a pasar al constructor para crear una instancia de resourcetype. Consulte Lista de parámetros.
resourceexpression Obligatorio. Variable o expresión que hace referencia a un recurso del sistema que cumple los requisitos de resourcetype. Si usa la segunda alternativa de sintaxis, debe adquirir el recurso antes de pasar el control a la Using instrucción .

Observaciones

A veces, el código requiere un recurso no administrado, como un identificador de archivo, un contenedor COM o una conexión SQL. Un Using bloque garantiza la eliminación de uno o varios recursos cuando el código haya terminado con ellos. Esto hace que estén disponibles para que otros código lo usen.

El recolector de elementos no utilizados (GC) de .NET Framework elimina los recursos administrados sin ninguna codificación adicional por su parte. No necesita un Using bloque para los recursos administrados. Sin embargo, todavía puede usar un Using bloque para forzar la eliminación de un recurso administrado en lugar de esperar al recolector de elementos no utilizados.

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

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

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

  • La eliminación significa llamar al Dispose método en el objeto de resourcename. Esto permite que el objeto finalice limpiamente sus recursos. La End Using instrucción elimina los recursos bajo el Using control del bloque.

Comportamiento

Un Using bloque se comporta como una Tryconstrucción ...Finally en la que el Try bloque usa los recursos y el Finally bloque los elimina. Por este motivo, el bloque garantiza la Using 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 .StackOverflowException

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

Si especifica más de un recurso del sistema en la Using instrucción , el efecto es el mismo que si anidado se Using bloquea uno dentro de otro.

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

Control estructurado de excepciones dentro de un bloque using

Si necesita controlar una excepción que puede producirse dentro del Using bloque, puede agregarle una construcción completa Try...Finally . Si necesita controlar el caso en el que la Using instrucción no se realiza correctamente en la adquisición de un recurso, puede probar para ver si resourcename es Nothing.

Control estructurado de excepciones en lugar de un bloque using

Si necesita un control más preciso sobre la adquisición de los recursos o necesita código adicional en el Finally bloque, puede volver a escribir el Using bloque como una Tryconstrucción ...Finally . En el ejemplo siguiente se muestran los esqueletos Try y Using las construcciones 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

Nota:

El código dentro del Using bloque no debe asignar el objeto en resourcename a otra variable. Al salir del Using bloque, se elimina el recurso y la otra variable no puede acceder al recurso al que apunta.

Ejemplo

En el ejemplo siguiente se crea un archivo denominado log.txt y se escriben dos líneas de texto en el archivo. En el ejemplo también se lee ese mismo archivo y se muestran las líneas de texto:

Dado que las TextWriter clases y TextReader implementan la IDisposable interfaz , el código puede usar Using instrucciones para asegurarse de que el archivo se cierra correctamente después de las operaciones de escritura y 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

Consulte también