Mat*_*eil -1 c++ syntax c++-cli
我正在阅读Microsoft 的这篇关于如何将托管类编组到本机以及相反的文章,我遇到了这些内容:
this->!context_node();protected:
!context_node()
{
// method definition
}
Run Code Online (Sandbox Code Playgroud)
我在 Google 和 StackOverflow 上搜索了上述代码片段中感叹号 ( ) 的含义!,但我没有找到任何相关内容,所以我在这里询问是否有人可以解释这一点。
预先感谢任何愿意回答的人。
!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 方法时抑制终结器。)