c++-cli - 为什么 Finalize 应该受到保护?

标签 c++-cli

阅读this MSDN article ,我遇到了这个简单的例子,它非常适合我,因为我做了一些 RAII一些 native C++ 接口(interface)上的类完成整个工作:(这是我第一次这样做)

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 方法放在 protected 范围内是否是一般用途和良好习惯。

最佳答案

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

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

正式来说,终结器是在对象上声明的 protected 虚拟方法:http://msdn.microsoft.com/en-us/library/system.object.finalize.aspx 。在 C# 中,您无法在终结器上放置可访问性修饰符。

在 C++/cli 中,您可以指定任何访问修饰符,但它本质上会被忽略。也就是说,公开或私有(private)化不会改变任何事情:特殊规则仍然执行。

所以,我想说,继续根据惯例对其进行保护。

关于c++-cli - 为什么 Finalize 应该受到保护?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5897435/

相关文章:

c# - 从 C++ 传递函数指针以供 C# 调用 - 函数的参数包括一个宽字符字符串 (LPCWSTR)

.net - C++/CLI : Catching all (. NET/Win32/CRT) 异常

c# - C++/CLI或C#用于在Windows上创建快速,现代和响应迅速的GUI

c++ - Visual C++ CLR 设计器在第二次运行项目和编辑设计时总是显示 0x8000000A 错误

visual-c++ - Visual C++/CLI (CLR) 空指针

c++ - 指向指针 C++/CLI 包装器的指针

c# - C++/CLI 包装器只能在 x86 机器上正常工作,我需要 x64 机器

.net - int 和 System::Int32 的区别

c# - (c++/cli) C++ 使用 C# dll 获取任何枚举成员名称

.net - 为什么将 IP 地址而不是域名传递给 System::Net::Mail::SmtpClient 会导致它抛出身份验证错误?