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

时间:2016-05-31 09:33:52

标签: c# idisposable dbconnection

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

起初我有这个:

root@localhost:playground > set session foreign_key_checks=0;
Query OK, 0 rows affected (0.00 sec)

root@localhost:playground > insert into comments (id) values (null);                                                                                              Query OK, 1 row affected (0.00 sec)

root@localhost:playground > set session foreign_key_checks=1;
Query OK, 0 rows affected (0.00 sec)

root@localhost:playground > select * from comments;
+----+-----------+
| id | parent_id |
+----+-----------+
|  1 |         0 |
+----+-----------+
1 row in set (0.00 sec)

root@localhost:playground > update comments set id = 0 where id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

root@localhost:playground > select * from comments;
+----+-----------+
| id | parent_id |
+----+-----------+
|  0 |         0 |
+----+-----------+
1 row in set (0.00 sec)

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

现在我有了这个,它可以工作(它确实关闭了连接,服务器就可以了):

root@localhost:playground > alter table comments auto_increment=0;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

为什么继承DbConnection类并重写Close()方法不起作用?

2 个答案:

答案 0 :(得分:1)

您可以在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();
}

答案 1 :(得分:0)

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

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

连接保持活动可能是因为你覆盖了关闭功能,但是我不确定,如果我错了,请纠正我。