2011-05-05 90 views
2

閱讀this MSDN article,我碰到的是簡單的例子,這因爲我對一些原生的C做一些RAII類++接口做整個作業真能勝任我就來了:(我做的第一次)爲什麼Finalize應該被保護?

ref class Wrapper { 
    Native *pn; 
public: 
    // resource acquisition is initialization 
    Wrapper(int val) { pn = new Native(val); } 

    // this will do our disposition of the native memory 
    ~Wrapper(){ delete pn; } 

    void mfunc(); 
protected: 

    // an explicit Finalize() method—as a failsafe 
    !Wrapper() { delete pn; } 
}; 

這個類完全符合我迄今爲止所寫的內容。除此之外,我還沒有實現Finalize方法。但是,在想知道它的特性和用法,以及在我能夠更深入地掌握它之前,我想知道是否將Finalizer方法放在受保護的範圍內是一般用途和良好習慣。

回答

5

的終結訪問修飾符基本上忽略不計,因爲有對終結特殊規則:

  1. 它們不能直接調用(甚至從類本身內)。
  2. 當系統調用它們時,它們會自動調用它們的基類終結器。

正式地,終結器是在Object上聲明的受保護的虛擬方法:http://msdn.microsoft.com/en-us/library/system.object.finalize.aspx。在C#中,你不能在終結器上放置一個accesibilty修飾符。

在C++/cli中,您可以指定任何訪問修飾符,但它基本上被忽略。也就是說,公共或私人都不會改變任何東西:特殊規則仍然得到執行。

所以,我想說,只是繼續使其保護只是基於約定。

相關問題