Using, instruction (Visual Basic)
Déclare le début d’un bloc Using
et acquiert éventuellement les ressources système que le bloc contrôle.
Syntaxe
Using { resourcelist | resourceexpression }
[ statements ]
End Using
Éléments
Terme | Définition |
---|---|
resourcelist |
Obligatoire si vous ne fournissez pas resourceexpression . Liste d’une ou plusieurs ressources système que ce bloc Using contrôle, séparées par des virgules. |
resourceexpression |
Obligatoire si vous ne fournissez pas resourcelist . Variable ou expression de référence faisant référence à une ressource système à contrôler par ce bloc Using . |
statements |
Optionnel. Bloc d’instructions que le bloc Using exécute. |
End Using |
Obligatoire. Arrête la définition du bloc Using et supprime toutes les ressources qu’il contrôle. |
Chaque ressource de la partie resourcelist
a la syntaxe et les parties suivantes :
resourcename As New resourcetype [ ( [ arglist ] ) ]
-ou-
resourcename As resourcetype = resourceexpression
Parties resourcelist
Terme | Définition |
---|---|
resourcename |
Obligatoire. Variable de référence qui fait référence à une ressource système que le bloc Using contrôle. |
New |
Obligatoire si l’instruction Using acquiert la ressource. Si vous avez déjà acquis la ressource, utilisez la deuxième syntaxe alternative. |
resourcetype |
Obligatoire. Classe de la ressource. La classe doit implémenter l’interface IDisposable. |
arglist |
Optionnel. Liste d’arguments que vous passez au constructeur pour créer une instance de resourcetype . Consultez Liste des paramètres. |
resourceexpression |
Obligatoire. Variable ou expression faisant référence à une ressource système répondant aux conditions de resourcetype . Si vous utilisez la deuxième syntaxe alternative, vous devez acquérir la ressource avant de passer le contrôle à l’instruction Using . |
Notes
Parfois, votre code a besoin d’une ressource non managée, telle qu’un handle de fichier, un wrapper COM ou une connexion SQL. Un bloc Using
garantit la suppression d’une ou plusieurs de ces ressources lorsque votre code se finit par elles. Cela permet de les avoir à disposition pour les utiliser dans un autre code.
Les ressources managées sont supprimées par le garbage collector (GC) du .NET Framework sans ajout de code de votre part. Vous n’avez pas besoin d’un bloc Using
pour les ressources managées. Toutefois, vous pouvez toujours utiliser un bloc Using
pour forcer la suppression d’une ressource managée au lieu d’attendre le garbage collector.
Un bloc Using
a trois parties : acquisition, utilisation et suppression.
Acquisition signifie créer une variable et l’initialiser pour faire référence à la ressource système. L’instruction
Using
peut acquérir une ou plusieurs ressources, ou vous pouvez acquérir exactement une ressource avant d’entrer le bloc et de la fournir à l’instructionUsing
. Si vous fournissezresourceexpression
, vous devez acquérir la ressource avant de passer le contrôle à l’instructionUsing
.Utilisation signifie accéder aux ressources et effectuer des actions avec celles-ci. Les instructions entre
Using
etEnd Using
représentent l’utilisation des ressources.Suppression signifie appeler la méthode Dispose sur l’objet dans
resourcename
. Cela permet à l’objet d’arrêter proprement ses ressources. L’instructionEnd Using
supprime les ressources sous le contrôle du blocUsing
.
Comportement
Un bloc Using
se comporte comme une construction Try
...Finally
dans laquelle le bloc Try
utilise les ressources et le bloc Finally
les supprime. Pour cette raison, le bloc Using
garantit la suppression des ressources, quelle que soit la façon dont vous quittez le bloc. C’est vrai même dans le cas d’une exception non gérée, sauf pour une StackOverflowException.
La portée de chaque variable de ressource acquise par l’instruction Using
est limitée au bloc Using
.
Si vous spécifiez plusieurs ressources système dans l’instruction Using
, l’effet est le même que si vous imbriquiez des blocs Using
les uns dans les autres.
Si resourcename
a la valeur Nothing
, aucun appel à Dispose n’est effectué et aucune exception n’est levée.
Gestion structurée des exceptions dans un bloc Using
Si vous devez gérer une exception susceptible de se produire dans le bloc Using
, vous pouvez y ajouter une construction Try
...Finally
complète. Si vous devez gérer le cas où l’instruction Using
n’a pas réussi à acquérir une ressource, vous pouvez tester pour voir si resourcename
est Nothing
.
Gestion structurée des exceptions à la place d’un bloc Using
Si vous avez besoin d’un contrôle plus précis sur l’acquisition des ressources, ou si vous avez besoin de code supplémentaire dans le bloc Finally
, vous pouvez réécrire le bloc Using
en tant que construction Try
...Finally
. L’exemple suivant montre le squelette des constructions Try
et Using
qui sont équivalentes dans l’acquisition et la suppression 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
Notes
Le code à l’intérieur du bloc Using
ne doit pas affecter l’objet dans le resourcename
d’une autre variable. Lorsque vous quittez le bloc Using
, la ressource est supprimée et l’autre variable ne peut pas accéder à la ressource vers laquelle elle pointe.
Exemple
L’exemple suivant crée un fichier nommé log.txt et écrit deux lignes de texte dans le fichier. L’exemple lit également ce même fichier et affiche les lignes de texte :
Étant donné que les classes TextWriter et TextReader implémentent l’interface IDisposable, le code peut utiliser des instructions Using
pour s’assurer que le fichier est correctement fermé après les opérations d’écriture et de lecture.
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