0

System::String^ ex;和之间实际上有什么区别System::String ex1;?我发现带有“^”的那个表示它是顶级的。但是,这是什么意思?

4

2 回答 2

2

System::String^是对托管字符串对象的引用,System::String是直接在堆栈上或内联在另一个类中的托管字符串对象。

正如C++/CLI 中的插入符号 ('^') 是什么意思中所述?,^是一个跟踪引用,大致相当于*非托管代码中的指针。以同样的方式你可以拥有unmanagedClass* foo1;and unmanagedClass foo2;,你可以拥有System::String^ str1;andSystem::String str2;

当不带 使用时,它遵循与不带 :^的非托管类相同的规则:使用非托管类*访问方法。离开范围时自动清理(非托管中的析构函数,托管中的处置方法)。.->

确实使使用托管对象^变得更加困难的一件事是,大多数托管对象没有定义复制构造函数或等于运算符。这些都不会在 C# 或 VB 中使用,因此它们通常不会被实现。没有它们,就不可能为没有 a 的变量分配新值^,因此您通常仅限于构造单个对象。

于 2012-08-21T17:19:59.810 回答
1

C++/CLI 有一个称为“堆栈语义”的特性。它旨在模拟 C++ 中的 RAII 模式,当您声明没有 ^ 帽子的引用类型的局部变量时,编译器会自动发出对类的析构函数的调用。

这不适用于 System::String 类,它没有析构函数。

由于它也没有任何有用的构造函数,所以当您尝试在不带帽子的情况下声明它时,您几乎总是会收到编译器错误消息。始终使用帽子。

于 2012-08-21T17:38:59.083 回答