为什么我需要我需要在 child class 上实现 IDisposable()

Why do I need I need to implement IDisposable() on a child class

我写了一个继承 DbConnection 的 class,但我不完全理解它为什么会这样工作。

起初我有这个:

public class DatabaseConnection : DbConnection
{
    ... 
    public override void Close()
    {
        // Some stuff
    }   
    // No Dispose method
}

using(var db = new DatabaseConnection())
{
    // Some processing
}

没有调用 Close() 方法,我们可以看到连接停留在 MySQL 服务器上。


现在我有了这个,它可以工作(它真的关闭了连接,服务器没问题):

public class DatabaseConnection : DbConnection, IDisposable
{
    ... 
    public override void Close()
    {
        // Some stuff
    }   

    public new void Dispose()
    {
        Close();
        base.Dispose();
        GC.SuppressFinalize(this);
    }
}

using(var db = new DatabaseConnection())
{
    // Some processing
}

为什么继承 DbConnection class 并覆盖 Close() 方法不起作用?

您可以在 reference source 中看到 DbConnection 不会覆盖 Dispose,因此 Dispose 不会调用 Close

DbConnection继承自Component,也就是IDisposable的实现所在。你可以从reference source看到它的Dispose(bool disposing)方法是virtual,所以你应该重写它:

protected override void Dispose(bool disposing)
{
    base.Dispose(disposing)
    Close();
}

using statement 在块的末尾调用 Dispose 方法。

由于 DbConnection 还实现了 IDisposable 接口,因此第一个代码段中的 using 块调用了继承的 Dispose 方法。

可能是因为你重写了Close函数,连接还活着,但我不确定,如果我错了请指正。