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 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 Using może uzyskać co najmniej jeden zasób lub uzyskać dokładnie jeden zasób przed wprowadzeniem bloku i podać go do instrukcji Using . Jeśli podasz resourceexpressionwartość , musisz uzyskać zasób przed przekazaniem kontrolki do instrukcji Using .

  • Użycie oznacza uzyskiwanie dostępu do zasobów i wykonywanie z nimi akcji. Instrukcje między Using i End 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. Instrukcja End Using usuwa zasoby pod Using kontrolą 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

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

Zobacz też