C++/CLI 中的感叹号
Exclamation mark in C++/CLI
我正在阅读 Microsoft 的 this article 关于如何将托管 类 编组为本机以及相反的方法,我遇到了这些行:
this->!context_node();
-
protected:
!context_node()
{
// method definition
}
我在 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 方法时抑制终结器。)
我正在阅读 Microsoft 的 this article 关于如何将托管 类 编组为本机以及相反的方法,我遇到了这些行:
this->!context_node();
-
protected: !context_node() { // method definition }
我在 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 方法时抑制终结器。)