IDisposable 的基本概念

每當你例項化一個實現 IDisposable 的類時,你應該在完成使用後在該類上呼叫 .Dispose 1 。這允許類清理它可能正在使用的任何託管或非託管依賴項。不這樣做可能會導致記憶體洩漏。

Using 關鍵字確保呼叫 .Dispose,而無需顯式呼叫它。

例如沒有 Using

Dim sr As New StreamReader("C:\foo.txt")
Dim line = sr.ReadLine
sr.Dispose()    

現在用 Using

Using sr As New StreamReader("C:\foo.txt")
    Dim line = sr.ReadLine
End Using '.Dispose is called here for you

Using 的一個主要優點是丟擲異常時,因為它確保呼叫 .Dispose

考慮以下。如果丟擲異常,你需要記住呼叫 .Dispose,但你可能還需要檢查物件的狀態以確保不會出現空引用錯誤等。

    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

使用塊意味著你不必記住這樣做,你可以在 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 我是否總是在 DbContext 物件上呼叫 Dispose()?不