2010-05-26 88 views

回答

16

终结器方法被称为~name()用您的类名替换“名称”。

C#编译器将从此生成终结器。

但请注意:

  1. 仅使用finaliser如果你真的需要它:你的类型直接包含原生资源(一种合成的包装只是使用Dispose模式)。
  2. 考虑专门SafeHandle,而不是写自己的。
  3. 实施dispose模式以允许呼叫者快速释放资源。
  4. 确保您的Dispose和Finalizer都是幂等性的—它们可以安全地多次调用。

例如

class MyClass : IDisposable { 
    private IntPtr SomeNativeResource; 

    ~MyClass() { 
    Dispose(false); 
    } 

    public void Dispose() { 
    Dispose(true); 
    } 

    protected virtual void Dispose(bool disposing) { 
    if (disposing) { 
     // Dispose any disposable fields here 
     GC.SuppressFinalize(this); 
    } 
    ReleaseNativeResource(); 
    } 
} 

子类可以覆盖Dispose(bool)添加它们添加任何另外的字段并调用基实现。

编辑:添加示例和笔记关于何时完成。

+0

你错过**无效**? – 2016-03-10 03:17:57

+0

@雷洋:是:两次。几乎6年后(!),现在已经修复。 – Richard 2016-03-10 09:01:26

7

你没有。

收听编译器。你不应该重写Finalize。相反,您应该实施IDisposible并重写Dispose。

除非您明确需要释放由对象直接保存的资源,否则您应该可以在Dispose方法中完成所需的任何操作。

但是如果你必须:

public class MyClass 
{ 
    public MyClass() { ... } // Constructor 
    public ~MyClass() { ... } // Destructor/Finalizer 
} 

只是要小心,因为终结是棘手的,如果实施不当可随身携带一些相当沉重的性能开销。

0

听听编译器错误,他们明智超越他们的岁月(除非你真的需要,在极少数情况下,实际上弄乱了终结者......命名在C#中有点倒退)。

而应该落实Dispose(),使你的类实现IDisposable,像这样:

public class MyClass : IDisposable 
{ 
    public void Dispose() 
    { 
    //cleanup 
    } 
} 

然后使用你的类时,它包装在一个using,像这样:

using(var mc = new MyClass()) { 
//use it for things 
} //it gets disposed here 
+0

然后使用你的类时,其包装在使用,如: 使用(VAR MC =新MyClass的()){// 用它来做事情 } //它被安置在这里 请详细说明。 ... as i havnt us“using”... – 2010-05-26 13:33:37

+0

@Ramakant - 当你想要像处理文件句柄一样处理一个对象时使用''using()'',例如:'using(var r = File.OpenText(“myFile.log”)){//对读者做些什么..},在该语句结束时,文件句柄尽快关闭,释放锁和资源。 – 2010-05-26 13:44:03