2017-01-08 23 views
-1

據我們所知,當我們想釋放對象使用它們的非託管資源時,我們使用「Disposable」接口的「Dispose」方法。當在「Dispose」方法中使用「GC.SuppressFinalize(this)」時,爲什麼類的析構函數(finalize)不會被觸發?

當對象不再可用時,該類的析構函數(以「〜」字符開始)會自動調用。

我的問題是: 當在「Dispose」方法中使用「GC.SuppressFinalize(this)」時,爲什麼類的析構函數(finalize)不會被觸發?

見例如1號,類的析構函數(〜ClassTest())將被觸發:

public class ClassTest : IDisposable 
{ 
    public int PropA { get; set; } 

    public ClassTest() 
    { 
     PropA = 10; 
    } 

    ~ClassTest() 
    { 
     Console.WriteLine("destructor"); 
    } 

    public void Dispose() 
    { 
     Console.WriteLine("dispose"); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     using (ClassTest cT = new ClassTest()) 
     { 
     } 
    } 
} 

見例如NO 2,類的析構函數(〜ClassTest())將不被射擊:

public class ClassTest : IDisposable 
{ 
    public int PropA { get; set; } 

    public ClassTest() 
    { 
     PropA = 10; 
    } 

    ~ClassTest() 
    { 
     Console.WriteLine("destructor"); 
    } 

    public void Dispose() 
    { 
     //it causes ~ClassTest() will not be fired, why? 
     GC.SuppressFinalize(this); 
     Console.WriteLine("dispose"); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     using (ClassTest cT = new ClassTest()) 
     { 
     } 
    } 
} 

我已經看到,導致問這個問題微軟MSDN的例子: IDisposable Interface

+0

@EugenePodskal沒有那是另一個問題,這個問題不關注類的析構函數。 – Alireza

+1

[第二個答案](http://stackoverflow.com/a/3038973/3745022)在這個問題中幾乎解釋瞭如何以及爲什麼會發生。 –

+3

錯誤......因爲這可能是'SuppressFinalize'方法的目的嗎? ;) –

回答

1

,除非有一個通信breakd自己,答案是在方法名稱:GC.SuppressFinalize。它抑制,停止,在給定的對象上運行終結。在Dispose或其他地方調用它會產生這種效果。

相關問題