是否建议在不使用 gcnew
的情况下创建本地 C++/CLI 对象?
以下哪种 string
对象 str1
和 str2
的创建是正确的或首选的?
void foo()
{
System::String str1("string 1");
System::String^ str2 = gcnew System::String("string 2");
// Do something with the strings
}
最佳答案
创建一个没有gcnew
的引用类型对象(ref class
)被称为stack semantics .
它的目的是镜像在堆栈上创建对象的普通 C++ 功能。它还启用 RAII:如果您的对象实现了 IDisposable
(或者在 C++/CLI 术语中,如果它有析构函数),则在您离开时将调用其 Dispose
(析构函数)方法声明它的范围(通常或通过异常传播)。就像调用普通的 C++ 析构函数一样。
在底层,对象是在托管堆上创建的,无论哪种情况,甚至在堆栈语义下也是如此。
因此,对 RAII 使用堆栈语义有一个明显的好处。如果您的对象不是一次性的,您可能最终会得到更少困惑的代码(您使用更少的 ^
字符并使用 .
而不是 ->
),但它可能会让读者感到困惑。这是你的决定。
关于c++ - 不使用 gcnew 创建 C++/CLI 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46071971/