2011-05-05 89 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中,您可以指定任何访问修饰符,但它基本上被忽略。也就是说,公共或私人都不会改变任何东西:特殊规则仍然得到执行。

所以,我想说,只是继续使其保护只是基于约定。

相关问题