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()?不