System::String^ ex;
和之间实际上有什么区别System::String ex1;
?我发现带有“^”的那个表示它是顶级的。但是,这是什么意思?
2 回答
System::String^
是对托管字符串对象的引用,System::String
是直接在堆栈上或内联在另一个类中的托管字符串对象。
正如C++/CLI 中的插入符号 ('^') 是什么意思中所述?,^
是一个跟踪引用,大致相当于*
非托管代码中的指针。以同样的方式你可以拥有unmanagedClass* foo1;
and unmanagedClass foo2;
,你可以拥有System::String^ str1;
andSystem::String str2;
当不带 使用时,它遵循与不带 :^
的非托管类相同的规则:使用非托管类*
访问方法。离开范围时自动清理(非托管中的析构函数,托管中的处置方法)。.
->
确实使使用托管对象^
变得更加困难的一件事是,大多数托管对象没有定义复制构造函数或等于运算符。这些都不会在 C# 或 VB 中使用,因此它们通常不会被实现。没有它们,就不可能为没有 a 的变量分配新值^
,因此您通常仅限于构造单个对象。
C++/CLI 有一个称为“堆栈语义”的特性。它旨在模拟 C++ 中的 RAII 模式,当您声明没有 ^ 帽子的引用类型的局部变量时,编译器会自动发出对类的析构函数的调用。
这不适用于 System::String 类,它没有析构函数。
由于它也没有任何有用的构造函数,所以当您尝试在不带帽子的情况下声明它时,您几乎总是会收到编译器错误消息。始终使用帽子。