为什么退出 "using" 会调用意外的 Dispose()?
Why exiting "using" invokes unexpected Dispose()?
这是我的案例:
class A : IDisposable
{
public void Dispose() { Console.WriteLine("A Dispose"); }
}
class B : A
{
public new void Dispose(){ Console.WriteLine("B Dispose"); }
}
class Program
{
static void Main(string[] args)
{
using (B b = new B())
{
}
}
}
最终输出为“A Dispose”。
我读过一些介绍 override 和 new 区别的文档,还有一些说“using”实质上等于“try-finally”的东西。但我仍然无法回答为什么 B::Dispose 没有被自动调用。
比较下面的输出是“B Dispose”
B b = new B();
try
{
}
finally
{
b.Dispose();
}
请帮忙,我错过了什么。
根据the C# language specification,对于参考类型:
using (ResourceType resource = «expression» ) «statement»
相当于
{
ResourceType resource = «expression»;
try {
«statement»;
}
finally {
IDisposable d = (IDisposable)resource;
if (d != null) d.Dispose();
}
}
如您所见,资源首先被转换为 IDisposable
,这意味着 A
的 Dispose
是被调用的,因为 B
的Dispose
只是隐藏它而不是覆盖它。
如果您想在 class 层次结构中正确实施 IDisposable
,see the best practices for this in the documentation。
这是我的案例:
class A : IDisposable
{
public void Dispose() { Console.WriteLine("A Dispose"); }
}
class B : A
{
public new void Dispose(){ Console.WriteLine("B Dispose"); }
}
class Program
{
static void Main(string[] args)
{
using (B b = new B())
{
}
}
}
最终输出为“A Dispose”。 我读过一些介绍 override 和 new 区别的文档,还有一些说“using”实质上等于“try-finally”的东西。但我仍然无法回答为什么 B::Dispose 没有被自动调用。 比较下面的输出是“B Dispose”
B b = new B();
try
{
}
finally
{
b.Dispose();
}
请帮忙,我错过了什么。
根据the C# language specification,对于参考类型:
using (ResourceType resource = «expression» ) «statement»
相当于
{
ResourceType resource = «expression»;
try {
«statement»;
}
finally {
IDisposable d = (IDisposable)resource;
if (d != null) d.Dispose();
}
}
如您所见,资源首先被转换为 IDisposable
,这意味着 A
的 Dispose
是被调用的,因为 B
的Dispose
只是隐藏它而不是覆盖它。
如果您想在 class 层次结构中正确实施 IDisposable
,see the best practices for this in the documentation。