C++/CLI 中的感叹号

Mat*_*eil -1 c++ syntax c++-cli

我正在阅读Microsoft 的这篇关于如何将托管类编组到本机以及相反的文章,我遇到了这些内容:

我在 Google 和 StackOverflow 上搜索了上述代码片段中感叹号 ( ) 的含义!,但我没有找到任何相关内容,所以我在这里询问是否有人可以解释这一点。

预先感谢任何愿意回答的人。

Dav*_*Yaw 5

!classname()终结器

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

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

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

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

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

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