为什么我需要我需要在 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函数,连接还活着,但我不确定,如果我错了请指正。
我写了一个继承 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函数,连接还活着,但我不确定,如果我错了请指正。