Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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
Usinginstrucción puede adquirir uno o varios recursos, o puede adquirir exactamente un recurso antes de entrar en el bloque y proporcionarlo a laUsinginstrucción . Si proporcionaresourceexpression, debe adquirir el recurso antes de pasar el control a laUsinginstrucción .El uso significa acceder a los recursos y realizar acciones con ellos. Las instrucciones entre
UsingyEnd Usingrepresentan 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. LaEnd Usinginstrucción elimina los recursos bajo elUsingcontrol 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