1

谁能告诉我这两行代码有什么区别,哪一个更好用?

    System::String ^MyStr = gcnew System::String(MyStr); 

    System::String ^MyStr; 
4

2 回答 2

2

这些线不等价。在第一个中,您将收到一个异常,因为您试图从未初始化的跟踪句柄 (MyStr) 创建一个字符串。在第二个中,MyStr 是声明的,而不是定义的,它指向垃圾,如果你尝试使用它会抛出异常。您应该使用哪一个取决于代码的其余部分

于 2011-06-10T17:06:27.737 回答
0

第二个创建一个新的句柄变量。如果它是一个局部变量,那么正如@dario_ramos 所说,它是未初始化的,如果您在分配它之前尝试使用句柄,您的程序可能会崩溃。如果它是成员变量或全局变量,那么它将是nullptr.

第一个类似,尽管它只能用于局部变量或全局变量(成员变量在 C++/CLI 中使用ctor-initializer语法,就像普通 C++ 一样),并且完全可以执行您不允许执行的操作。它读取全新的未初始化句柄并将其传递给System::String构造函数。如果偶然构造函数完成,新构造的句柄String将作为初始化的一部分放入变量中。但是因为构造函数试图复制随机垃圾(如果它是本地的)或nullptr(如果是全局的),很可能它会简单地崩溃。

在其自己的初始化程序中使用任何变量的值是一个坏主意(有时您需要使用地址,而不是值)。

于 2011-06-11T13:11:27.033 回答