Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Deklaruje początek Using bloku i opcjonalnie uzyskuje zasoby systemowe, które kontroluje blok.
Składnia
Using { resourcelist | resourceexpression }
[ statements ]
End Using
Części
| 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 |
To jest wymagane. 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 |
To jest wymagane. 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 |
To jest wymagane. 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 |
To jest wymagane. Zmienna lub wyrażenie odwołujące się do zasobu systemowego spełniającego resourcetypewymagania . 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
Usingmoże uzyskać co najmniej jeden zasób lub uzyskać dokładnie jeden zasób przed wprowadzeniem bloku i podać go do instrukcjiUsing. Jeśli podaszresourceexpressionwartość , 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
UsingiEnd Usingreprezentują użycie zasobów.Usuwanie oznacza wywołanie Dispose metody w obiekcie w obiekcie .
resourcenameDzięki temu obiekt może czyścić jego zasoby. InstrukcjaEnd Usingusuwa zasoby podUsingkontrolą bloku.
Zachowanie
Blok Using zachowuje się jak Trykonstrukcja ,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ę UsingUsing 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 Nothingwartość , 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ą Trykonstrukcję ...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 resourceelementu .
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 / Notatka
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