不使用 gcnew 创建 C++/CLI 对象

Creating C++/CLI objects without gcnew

在没有 gcnew 的情况下创建本地 C++/CLI 对象是否可取? 以下 string 个对象 str1str2 的创建是正确的还是首选?

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 使用堆栈语义有一个明显的好处。如果您的对象不是一次性的,您 可能 最终得到更简洁的代码(您使用更少的 ^ 个字符并使用 . 而不是 ->)但它可能会混淆 reader。由你决定。