110,499
社区成员
发帖
与我相关
我的任务
分享
Dispose(true);//自定义了一个private的Dispose(bool)函数
GC.SuppressFinalize(true);//这个不调用又会怎么样呢?
public class b : IDisposable
{
public int i;
public b() { Console.WriteLine("ctor"); }
~b() { Console.WriteLine("dtor"); }
public void Dispose()
{
Console.WriteLine("Dispose");
GC.SuppressFinalize(true);
}
}
class Program
{
static void Main(string[] args)
{
b objb = new b { i = 2 };
using (objb)
{
Console.WriteLine("using");
}
Console.WriteLine("after using");
}
}
运行输出是:
ctor
using
Dispose
after using
dtor
Press any key to continue . . .
如果我把Suppress的参数从true改成false:
GC.SuppressFinalize(false);
发现结果还是一样。我的疑惑是,既然SuppressFinalize(false)了,那么是不是应该在Dispose()函数的末尾,也就是using块结束的时候,调用b.Finalize()也就是~b()。因此应该是先打印
dtor
再打印
after using
可是事实上是,现在的输出仍然是:
ctor
using
Dispose
after using
dtor
Press any key to continue . . .
看起来这个Suppress(false)没有起到作用啊?
还是我对于Dispose/using/Finalize的理解有误区? 上面这个小程序是VC#2012上编译执行的
请指教![/quote]
不是啊,只是通知GC去回收,不是说立刻去回收。
public class b : IDisposable
{
public int i;
public b() { Console.WriteLine("ctor"); }
~b() { Console.WriteLine("dtor"); }
public void Dispose()
{
Console.WriteLine("Dispose");
GC.SuppressFinalize(true);
}
}
class Program
{
static void Main(string[] args)
{
b objb = new b { i = 2 };
using (objb)
{
Console.WriteLine("using");
}
Console.WriteLine("after using");
}
}
运行输出是:
ctor
using
Dispose
after using
dtor
Press any key to continue . . .
如果我把Suppress的参数从true改成false:
GC.SuppressFinalize(false);
发现结果还是一样。我的疑惑是,既然SuppressFinalize(false)了,那么是不是应该在Dispose()函数的末尾,也就是using块结束的时候,调用b.Finalize()也就是~b()。因此应该是先打印
dtor
再打印
after using
可是事实上是,现在的输出仍然是:
ctor
using
Dispose
after using
dtor
Press any key to continue . . .
看起来这个Suppress(false)没有起到作用啊?
还是我对于Dispose/using/Finalize的理解有误区? 上面这个小程序是VC#2012上编译执行的
请指教!