繁体   English   中英

为什么我需要在子类上实现 IDisposable()

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

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

起初我有这个:

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 类并覆盖 Close() 方法不起作用?

您可以在参考源中看到DbConnection没有覆盖Dispose ,因此Dispose不会调用Close

DbConnection继承自Component ,这是IDisposable的实现所在。 您可以从参考源看到它的Dispose(bool disposing)方法是virtual ,因此您应该覆盖它:

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

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

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

连接保持活动状态可能是因为您覆盖了 Close 函数,但我不确定这一点,如果我错了,请纠正我。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM