我看到很多实现public void Dispose()的代码都是这样的: Dispose(true);//自定义了一个private的Dispose(bool)函数
GC.SuppressFinalize(true);//这个不调用又会怎么样呢?问题: 在Dispose函数内部一定要调用GC.SuppressFinalize吗?
如果一定要调用,那么传入true和传入false会有什么不同的效果么?
GC.SuppressFinalize(true);//这个不调用又会怎么样呢?问题: 在Dispose函数内部一定要调用GC.SuppressFinalize吗?
如果一定要调用,那么传入true和传入false会有什么不同的效果么?
GC.SuppressFinalize(true); 这就是告诉系统,看到死尸了,让他去清理一下
这个SuppresFinalize我的里面是不要Finalize,也就是不要清理啊
{
Dispose(true);
// This object will be cleaned up by the Dispose method.
// Therefore, you should call GC.SupressFinalize to
// take this object off the finalization queue
// and prevent finalization code for this object
// from executing a second time.
GC.SuppressFinalize(this);
}
{
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上编译执行的
请指教!
{
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上编译执行的
请指教!不是啊,只是通知GC去回收,不是说立刻去回收。