为什么Finalize应该受到保护?

Ste*_*and 2 c++-cli

阅读这篇MSDN文章,我遇到了一个简单的例子,它非常适合我,因为我在一些本机c ++接口上完成了一些RAII课程,完成了整个工作:(我是第一次这样做)

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; }
};
Run Code Online (Sandbox Code Playgroud)

这个类与我到目前为止所写的完全一致.保存我没有实现Finalize方法.但是在想到它的特性和用法之前,在我能够更深入地了解它之前......我想知道将Finalizer方法放在保护范围内是否是一般用途和好习惯.

Mat*_*ith 5

终结器的访问修饰符基本上被忽略,因为终结器有特殊规则:

  1. 它们不能直接调用(即使是在类本身内).
  2. 当系统调用它们时,它们会自动调用它们的基类终结器.

正式地说,终结器是在Object上声明的受保护的虚拟方法:http://msdn.microsoft.com/en-us/library/system.object.finalize.aspx.在C#中,您无法在终结器上放置accesibilty修饰符.

在C++/cli中,您可以指定任何访问修饰符,但它基本上被忽略.也就是说,将其公开或私有改变一事:特殊规则仍然得到执行.

所以,我会说,只是继续根据惯例保护它.