Using (Instrucción, Visual Basic)

Declara el principio de un bloque y, opcionalmente, adquiere los recursos del Using 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 varios recursos del sistema que controla Using este bloque, separados por comas.
resourceexpression Obligatorio si no proporciona resourcelist . Variable de referencia o expresión que hace referencia a un recurso del sistema que este bloque va a Using controlar.
statements Opcional. Bloque de instrucciones que ejecuta Using el bloque.
End Using Necesario. 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 bien

resourcename As resourcetype = resourceexpression

resourcelist Parts

Término Definición
resourcename Obligatorio. Variable de referencia que hace referencia a un recurso del sistema que Using controla el bloque.
New Obligatorio si Using la instrucción adquiere el recurso. Si ya ha adquirido el recurso, use la segunda alternativa de sintaxis.
resourcetype Necesario. Clase del recurso. La clase debe implementar la IDisposable interfaz .
arglist Opcional. Lista de argumentos que se pasan al constructor para crear una instancia de resourcetype . Vea Lista de parámetros.
resourceexpression Necesario. 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 .

Comentarios

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

El recolector de elementos no utilizados (GC) .NET Framework elimina los recursos administrados sin ninguna codificación adicional por su parte. No necesita un bloque Using para los recursos administrados. Sin embargo, puede seguir utilizando un bloque para forzar la eliminación de un recurso administrado en lugar de Using 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 instrucción puede adquirir uno o varios recursos, o bien puede adquirir exactamente un recurso antes de entrar en el bloque y Using suministrarlo a la Using instrucción . Si proporciona resourceexpression , debe adquirir el recurso antes de pasar el control a la instrucción Using .

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

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

Comportamiento

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

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

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

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

Control estructurado de excepciones dentro de un bloque Using

Si necesita controlar una excepción que puede producirse dentro del bloque , puede agregarle una Using construcción Try Finally completa... . Si necesita controlar el caso en el que la instrucción no tiene éxito al adquirir un recurso, puede probar para Using 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 bloque, puede volver a escribir el bloque como Finally Using una construcción ... Try Finally . En el ejemplo siguiente se muestra Try el esqueleto y las construcciones equivalentes en la Using 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 a otra resourcename variable. Al salir del bloque, el recurso se elimina y la otra variable no puede acceder Using 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 clases y implementan la interfaz , el código puede usar instrucciones para asegurarse de que el archivo se cierra correctamente después de las TextWriter operaciones de escritura y TextReader IDisposable Using 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