2010-05-26 35 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