Using — Instrukcja (Visual Basic)
Deklaruje początek Using
bloku i opcjonalnie uzyskuje zasoby systemowe, które kontroluje blok.
Składnia
Using { resourcelist | resourceexpression }
[ statements ]
End Using
generatora
Termin | Definicja |
---|---|
resourcelist |
Wymagane, jeśli nie podasz resourceexpression . Lista co najmniej jednego zasobu systemowego, który ten Using blok steruje przecinkami. |
resourceexpression |
Wymagane, jeśli nie podasz resourcelist . Odwołanie do zmiennej lub wyrażenia odwołującego się do zasobu systemowego, który ma być kontrolowany przez ten Using blok. |
statements |
Opcjonalny. Blok instrukcji uruchamianych przez Using blok. |
End Using |
Wymagany. Przerywa definicję Using bloku i usuwa wszystkie zasoby, które kontroluje. |
Każdy zasób w resourcelist
tej części ma następującą składnię i części:
resourcename As New resourcetype [ ( [ arglist ] ) ]
— lub —
resourcename As resourcetype = resourceexpression
resourcelist — części
Termin | Definicja |
---|---|
resourcename |
Wymagany. Zmienna referencyjna odwołująca się do zasobu systemowego Using , który kontroluje blok. |
New |
Wymagane, jeśli instrukcja Using uzyskuje zasób. Jeśli zasób został już uzyskany, użyj drugiej alternatywy składni. |
resourcetype |
Wymagany. Klasa zasobu. Klasa musi implementować IDisposable interfejs. |
arglist |
Opcjonalny. Lista argumentów przekazywanych do konstruktora w celu utworzenia wystąpienia klasy resourcetype . Zobacz Lista parametrów. |
resourceexpression |
Wymagany. Zmienna lub wyrażenie odwołujące się do zasobu systemowego spełniającego resourcetype wymagania . Jeśli używasz drugiej alternatywy składni, musisz uzyskać zasób przed przekazaniem kontrolki do instrukcji Using . |
Uwagi
Czasami kod wymaga niezarządzanego zasobu, takiego jak dojście do pliku, otoka COM lub połączenie SQL. Blok Using
gwarantuje usunięcie co najmniej jednego takiego zasobu po zakończeniu działania kodu. Dzięki temu będą one dostępne dla innego kodu do użycia.
Zasoby zarządzane są usuwane przez moduł odśmieceń pamięci programu .NET Framework (GC) bez konieczności dodatkowego kodowania w danej części. Nie potrzebujesz Using
bloku dla zasobów zarządzanych. Jednak nadal można użyć Using
bloku, aby wymusić usunięcie zarządzanego zasobu zamiast czekać na moduł odśmiecenia pamięci.
Blok Using
ma trzy części: pozyskiwanie, użycie i usuwanie.
Pozyskiwanie oznacza utworzenie zmiennej i zainicjowanie jej w celu odwoływania się do zasobu systemowego. Instrukcja
Using
może uzyskać co najmniej jeden zasób lub uzyskać dokładnie jeden zasób przed wprowadzeniem bloku i podać go do instrukcjiUsing
. Jeśli podaszresourceexpression
wartość , musisz uzyskać zasób przed przekazaniem kontrolki do instrukcjiUsing
.Użycie oznacza uzyskiwanie dostępu do zasobów i wykonywanie z nimi akcji. Instrukcje między
Using
iEnd Using
reprezentują użycie zasobów.Usuwanie oznacza wywołanie Dispose metody w obiekcie w obiekcie .
resourcename
Dzięki temu obiekt może czyścić jego zasoby. InstrukcjaEnd Using
usuwa zasoby podUsing
kontrolą bloku.
Zachowanie
Blok Using
zachowuje się jak Try
konstrukcja ,Finally
w której Try
blok wykorzystuje zasoby i Finally
blok usuwa je. W związku z tym Using
blok gwarantuje usunięcie zasobów, bez względu na sposób wyjścia z bloku. Jest to prawdą nawet w przypadku nieobsługiwanego wyjątku, z wyjątkiem .StackOverflowException
Zakres każdej zmiennej zasobu uzyskanej przez instrukcję Using
Using
jest ograniczony do bloku.
Jeśli w instrukcji Using
określisz więcej niż jeden zasób systemowy, efekt jest taki sam, jak w przypadku zagnieżdżenia Using
bloków w obrębie innego.
Jeśli resourcename
parametr ma Nothing
wartość , nie zostanie wykonane żadne wywołanie Dispose i nie zostanie zgłoszony żaden wyjątek.
Obsługa wyjątków strukturalnych w bloku przy użyciu
Jeśli musisz obsłużyć wyjątek, który może wystąpić w Using
bloku, możesz dodać do niego kompletną Try
konstrukcję ...Finally
. Jeśli musisz obsłużyć przypadek, w którym Using
instrukcja nie powiedzie się podczas uzyskiwania zasobu, możesz sprawdzić, czy resourcename
jest to Nothing
.
Obsługa wyjątków strukturalnych zamiast przy użyciu bloku
Jeśli potrzebujesz bardziej precyzyjnej kontroli nad pozyskiwaniem zasobów lub potrzebujesz dodatkowego kodu w Finally
bloku, możesz przepisać Using
blok jako konstrukcję Try
...Finally
. W poniższym przykładzie przedstawiono szkielet Try
i Using
konstrukcje, które są równoważne w pozyskiwaniu i usuwaniu resource
elementu .
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
Uwaga
Kod wewnątrz Using
bloku nie powinien przypisywać obiektu do resourcename
innej zmiennej. Po wyjściu z Using
bloku zasób jest usuwany, a druga zmienna nie może uzyskać dostępu do zasobu, do którego wskazuje.
Przykład
Poniższy przykład tworzy plik o nazwie log.txt i zapisuje dwa wiersze tekstu w pliku. Przykład odczytuje również ten sam plik i wyświetla wiersze tekstu:
TextWriter Ponieważ klasy i TextReader implementują IDisposable interfejs, kod może używać Using
instrukcji, aby upewnić się, że plik jest poprawnie zamknięty po operacjach zapisu i odczytu.
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