不用using关键字的时候,实现了IDisposable接口的对象,会在作用域之外释放吗?
本帖最后由 u013761502 于 2014-02-26 08:59:34 编辑
<<C#入门经典>>第五版里面这样说:
IDisposable 接口特别有趣。支持IDisposable 接口的对象必须实现其Dispose()方法,即它们必须
提供这个方法的代码。当不再需要某个对象(例如,在对象超出作用域之前)时,就调用这个方法,
释放重要的资源,否则,该资源会等到对垃圾回收调用析构方法时才释放。这样可以更好地控制对
象所使用的资源。
C#允许使用一种可以优化使用这个方法的结构。using 关键字可以在代码块中初始化使用重要
资源的对象,会在这个代码块的末尾自动调用Dispose()方法
我于是做了一个实验有下面这样的代码:
struct m : IDisposable
{
#region IDisposable Members
public void Dispose()
{
Console.WriteLine("abc");
}
#endregion
}
class Program
{
static void Main(string[] args)
{
for (int i = 0; i < 3; ++i)
{
Console.ReadKey();
m obj = new m();
}
}
}
我期待的结果是,因为变量obj声明在for的内部,每次for进入下一次循环的时候,就是obj已经超出了作用域,上一次的obj就无效了,应该被Dispose。但是我运行发现,并没有打印我期待的3次"abc"啊。
这是为什么呢? 代码应该怎么改,还是我的理解有偏差? 谢谢。
------解决方案--------------------你的理解有偏差,IDisposable仅仅是一个接口,没有多么神奇的功能,只是using的语法特殊照顾了这个接口而已。