Visual Basic .NET Language
Przedmioty jednorazowe
Szukaj…
Podstawowa koncepcja IDisposable
Za każdym razem, gdy tworzysz instancję klasy, która implementuje IDisposable
, powinieneś wywołać .Dispose
1 na tej klasie po zakończeniu jej używania. Pozwala to klasie wyczyścić wszelkie zarządzane lub niezarządzane zależności, których może używać. Nie wykonanie tego może spowodować wyciek pamięci.
.Dispose
kluczowe Using
zapewnia, że .Dispose
jest .Dispose
, bez konieczności jawnego wywoływania go.
Na przykład bez Using
:
Dim sr As New StreamReader("C:\foo.txt")
Dim line = sr.ReadLine
sr.Dispose()
Teraz z Using
:
Using sr As New StreamReader("C:\foo.txt")
Dim line = sr.ReadLine
End Using '.Dispose is called here for you
Jedną z głównych zalet Using
jest rzucanie wyjątku, ponieważ zapewnia on .Dispose
.
Rozważ następujące. Jeśli zgłoszony zostanie wyjątek, musisz pamiętać o wywołaniu funkcji .Dysponuj, ale może być również konieczne sprawdzenie stanu obiektu, aby upewnić się, że nie wystąpił błąd zerowej referencji itp.
Dim sr As StreamReader = Nothing
Try
sr = New StreamReader("C:\foo.txt")
Dim line = sr.ReadLine
Catch ex As Exception
'Handle the Exception
Finally
If sr IsNot Nothing Then sr.Dispose()
End Try
Blok używający oznacza, że nie musisz tego robić i możesz zadeklarować swój obiekt w ramach try
:
Try
Using sr As New StreamReader("C:\foo.txt")
Dim line = sr.ReadLine
End Using
Catch ex As Exception
'sr is disposed at this point
End Try
1 Czy zawsze muszę wywoływać Dispose () na moich obiektach DbContext? nie
Deklarowanie większej liczby obiektów w jednym Korzystanie
Czasami musisz utworzyć dwa obiekty Disposable
z rzędu. Istnieje prosty sposób na uniknięcie zagnieżdżania się. Using
bloków.
Ten kod
Using File As New FileStream("MyFile", FileMode.Append)
Using Writer As New BinaryWriter(File)
'You code here
Writer.Writer("Hello")
End Using
End Using
można skrócić do tego. Główną zaletą jest to, że zyskujesz jeden poziom wcięcia:
Using File As New FileStream("MyFile", FileMode.Append), Writer As New BinaryWriter(File)
'You code here
Writer.Writer("Hello")
End Using