C++/CLI 中的感叹号

Exclamation mark in C++/CLI

我正在阅读 Microsoft 的 this article 关于如何将托管 类 编组为本机以及相反的方法,我遇到了这些行:

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

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

!classname() 就是 finalizer.

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

如果您实现一个方法 ~classname(),那就是 Dispose 方法,因为它是 C++/CLI。它不是普通 C++ 中的析构函数。如果您实现它,编译器会自动使您的 class 实现 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 方法时抑制终结器。)