C# 的 Finalize()方法一种是:
class a
{
  ~a()
   {
   }
}一种是:
class a
{
   public  void Finalize()
   {
   }
}到底是 ~a() 还是 Finalize() ?两者有什么区别?还有 Dispose() 和 Close() 又有什么区别?谢谢。

解决方案 »

  1.   

    ~a() 还是 Finalize() ?
    ~a()和Finalize()是一样的  他们会生成相同的IL中间语言Close   以后,这个实例还在,只不过被标记成了dispose,等待下次启动垃圾收集的时候清除掉。
      

  2.   

    ~方法和Finalize()法类似。~是保持C++的风格。但这两种方法已经很少用了,因为这是由垃圾收集器调用的。而垃圾收集器什么时候收集是不可预知的。还有 Dispose() 和 Close() 又有什么区别?谢谢。
    ---
    一般是一样的,在特定类里面有不同效果。有些类没有Close方法,如果有Close方法的类,一般调用Close方法。
      

  3.   

    //如果有Close方法的类,一般调用Close方法
    是的,比如数据库连接对象,一般应调用Close方法而不要Dispose
    Close方法是释放到连接池,并不会销毁对象
      

  4.   

    那么请看如下代码:using System;class a
    {
    /*~a()
    {
    Console.WriteLine("~bye");
    }*/ public void Finalize()
    {
    Console.WriteLine("bye");
    }
    }class mycls
    {
    public static void Main(string[] v)
    {
    a a0=new a();
    a a1=new a();
    a0=a1;
    }
    }1 在使用 ~a()时,代码运行结束后会显示 "~bye"2 但在使用 Finalize() 时,代码运行结束后没有显示 "bye"请问如果 ~a() 和 Finalize() 相同,为何两者行为不同?
      

  5.   

    请直接在控制台中编译:csc a.cs
      

  6.   

    ILDasm 反汇编的结果并不相同:~a():.method family hidebysig virtual instance void 
            Finalize() cil managed
    {
      // Code size       25 (0x19)
      .maxstack  1
      .try
      {
        IL_0000:  nop
        IL_0001:  ldstr      "~bye"
        IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
        IL_000b:  nop
        IL_000c:  nop
        IL_000d:  leave.s    IL_0017
      }  // end .try
      finally
      {
        IL_000f:  ldarg.0
        IL_0010:  call       instance void [mscorlib]System.Object::Finalize()
        IL_0015:  nop
        IL_0016:  endfinally
      }  // end handler
      IL_0017:  nop
      IL_0018:  ret
    } // end of method a::Finalize
    Finalize() :.method public hidebysig instance void  Finalize() cil managed
    {
      // Code size       13 (0xd)
      .maxstack  8
      IL_0000:  nop
      IL_0001:  ldstr      "bye"
      IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
      IL_000b:  nop
      IL_000c:  ret
    } // end of method a::Finalize
      

  7.   

    http://book.77169.com/data/web5201/20050228/20050228__3792703.html
    看看这个