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