【问题标题】:Exclamation mark in C++/CLIC++/CLI 中的感叹号
【发布时间】:2022-01-15 22:58:44
【问题描述】:

我正在阅读 Microsoft 的 this article,了解如何将托管类编组为本地类,反之亦然,我遇到了以下几行:

  • this->!context_node();
  • protected:
      !context_node()
      {
        // method definition
      }
    

我在 Google 和 StackOverflow 上搜索了上述代码段中感叹号 (!) 的含义,但我一无所获,所以我在这里询问是否有人可以阐明这一点。

提前感谢任何愿意回答的人。

【问题讨论】:

    标签: c++ syntax c++-cli


    【解决方案1】:

    !classname()finalizer

    由于这些是托管类,它们的生命周期由垃圾收集器控制。

    如果你实现了一个方法~classname(),那就是Dispose方法,因为它是C++/CLI。它不是普通 C++ 中的析构函数。如果您实现它,编译器会自动使您的类实现 IDisposable,并从 C++/CLI 调用 delete 或在 C# 中调用 Dispose 将调用该方法。

    如果你实现了一个方法!classname(),那就是终结器。垃圾收集器在清理该对象时会自动调用该方法。

    在您链接到的示例中,他们也有这个:

    public:
      ~context_node()
      {
        this->!context_node();
      }
    protected:
      !context_node()
      {
        // (Step 7) Clean up native resources.
      }
    

    所以,这是一个 Dispose 方法 (~),它显式调用 Finalizer 方法 (!),因此没有代码重复。这样,既可以显式调用delete(或者使用堆栈语义,同样的事情),也可以等待垃圾收集器清理它,无论哪种方式,本机资源都会被正确清理。如果您有任何托管资源,则只能在 Dispose 方法中清理它们,而不是在终结器中。 (C++/CLI 编译器知道如何正确实现 IDisposable 模式,因此它知道在调用 Dispose 方法时抑制终结器。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-01
      相关资源
      最近更新 更多