谁能告诉我这两行代码有什么区别,哪一个更好用?
System::String ^MyStr = gcnew System::String(MyStr);
System::String ^MyStr;
这些线不等价。在第一个中,您将收到一个异常,因为您试图从未初始化的跟踪句柄 (MyStr) 创建一个字符串。在第二个中,MyStr 是声明的,而不是定义的,它指向垃圾,如果你尝试使用它会抛出异常。您应该使用哪一个取决于代码的其余部分
第二个创建一个新的句柄变量。如果它是一个局部变量,那么正如@dario_ramos 所说,它是未初始化的,如果您在分配它之前尝试使用句柄,您的程序可能会崩溃。如果它是成员变量或全局变量,那么它将是nullptr
.
第一个类似,尽管它只能用于局部变量或全局变量(成员变量在 C++/CLI 中使用ctor-initializer语法,就像普通 C++ 一样),并且完全可以执行您不允许执行的操作。它读取全新的未初始化句柄并将其传递给System::String
构造函数。如果偶然构造函数完成,新构造的句柄String
将作为初始化的一部分放入变量中。但是因为构造函数试图复制随机垃圾(如果它是本地的)或nullptr
(如果是全局的),很可能它会简单地崩溃。
在其自己的初始化程序中使用任何变量的值是一个坏主意(有时您需要使用地址,而不是值)。