首页 新闻 会员 周边

using和Dispose的区别

0
悬赏园豆:30 [已解决问题] 解决于 2017-02-22 10:23

最近看书,看到这里,有些不解,请教下。

如下,有两个类

 

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呢?

youyingchou的主页 youyingchou | 初学一级 | 园豆:175
提问于:2017-02-21 20:22
< >
分享
最佳答案
0

Base c=new Deriver();//发生隐式转换,

Deriver c1=(Deriver)c; //显示转换

堆中的对象都是同一个,只是堆栈中的引用指针生成了多个,指向的是同一个。

再来看using 的 finally 类似这样的

            finally
            {
                if (c != null)
                {
                    IDisposable dis = (IDisposable)c;
                    dis.Dispose();
                }
            }

 

收获园豆:30
Qlin | 老鸟四级 |园豆:2403 | 2017-02-22 09:36

 哦,原来是这样,我就是不清楚using里面的这个finally里面的代码,网上查也查不到。我还以为这里执行的是c.Dispose(); 想来也是,能在using里的都是实现了IDisposable接口的,所以会执行接口的方法,而执行这个接口的Dispose方法的时候最终会找到Deriver方法表里的Dispose()方法,因为最终都指向的是new Deriver();

youyingchou | 园豆:175 (初学一级) | 2017-02-22 10:15

不过dis那里应该不需要显示转换,c肯定是实现了IDisposable接口的,所以隐式转换就可以了。

youyingchou | 园豆:175 (初学一级) | 2017-02-22 10:21
其他回答(2)
0

因为 c= new Deriver()

jello chen | 园豆:7336 (大侠五级) | 2017-02-21 20:42
0

因为你是new.并且using的时候不是通过 Base b调用dispose的.而是直接调用deriver的dispose.

证据就是你可以在using中不base b 直接写一个new 他一样调用.他是通过using表达式的值来调用的

也就是这道题的考点有2点

1.在子类中用new覆盖父类实现的结果

2.using时调用对象dispose的方式

吴瑞祥 | 园豆:29449 (高人七级) | 2017-02-21 20:52
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册