我看到很多实现public void Dispose()的代码都是这样的:   Dispose(true);//自定义了一个private的Dispose(bool)函数
   GC.SuppressFinalize(true);//这个不调用又会怎么样呢?问题: 在Dispose函数内部一定要调用GC.SuppressFinalize吗?
如果一定要调用,那么传入true和传入false会有什么不同的效果么?

解决方案 »

  1.   

    dispose告诉这个实体:哥不要你了,你可以去死了。
    GC.SuppressFinalize(true); 这就是告诉系统,看到死尸了,让他去清理一下
      

  2.   


    这个SuppresFinalize我的里面是不要Finalize,也就是不要清理啊
      

  3.   

    GC.SuppressFinalize(this); 一般是这么写的吧。就是告诉垃圾回收器不要调用指定对象的Dispose方法,因为之前Dispose(true);已经做过了。防止两次执行。
      

  4.   

      msdn上是这么解释的该方法在对象头中设置一个位,系统在调用终结器时将检查这个位。obj 参数应为此方法的调用方。实现 IDisposable 接口的对象可以从 IDisposable.Dispose 方法调用此方法,以防止垃圾回收器对不需要终止的对象调用 Object.Finalize。也就是向上楼说的防止多次调用Object.Finalize吧 节约性能  public void Dispose()
      {
                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);
      }
      

  5.   

    我写了下面这个小程序:    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上编译执行的
    请指教!
      

  6.   

    我写了下面这个小程序:    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上编译执行的
    请指教!不是啊,只是通知GC去回收,不是说立刻去回收。
      

  7.   

    对于这种控制台的小程序,有时候无论你怎么写,包括写GC.Collect(),还是在进程退出的时候才回收。