最近看书,看到这里,有些不解,请教下。
如下,有两个类
class Base:IDisposable
{
public void Dispose()
{
Console.WriteLine("Base.Dispose……");
}
}
class Deriver : Base, IDisposable
{
public new void Dispose()
{
Console.WriteLine("Deriver.Dispose……");
}
}
然后执行
static void Main(string[] args)
{
Base b = new Deriver();
b.Dispose();
using (Base c= new Deriver())
{
c.Dispose();
}
Console.ReadLine();
}
最后结果是
请问为什么using结束之后执行的是Deriver的Dispose呢?
Base c=new Deriver();//发生隐式转换,
Deriver c1=(Deriver)c; //显示转换
堆中的对象都是同一个,只是堆栈中的引用指针生成了多个,指向的是同一个。
再来看using 的 finally 类似这样的
finally { if (c != null) { IDisposable dis = (IDisposable)c; dis.Dispose(); } }
哦,原来是这样,我就是不清楚using里面的这个finally里面的代码,网上查也查不到。我还以为这里执行的是c.Dispose(); 想来也是,能在using里的都是实现了IDisposable接口的,所以会执行接口的方法,而执行这个接口的Dispose方法的时候最终会找到Deriver方法表里的Dispose()方法,因为最终都指向的是new Deriver();
不过dis那里应该不需要显示转换,c肯定是实现了IDisposable接口的,所以隐式转换就可以了。
因为 c= new Deriver()
因为你是new.并且using的时候不是通过 Base b调用dispose的.而是直接调用deriver的dispose.
证据就是你可以在using中不base b 直接写一个new 他一样调用.他是通过using表达式的值来调用的
也就是这道题的考点有2点
1.在子类中用new覆盖父类实现的结果
2.using时调用对象dispose的方式