System :: String ^和System :: String之间的区别

时间:2012-08-21 15:32:11

标签: .net c++-cli

System::String^ ex;System::String ex1;之间的实际区别是什么? 我发现那个" ^"意味着它是顶级的。但这意味着什么?

2 个答案:

答案 0 :(得分:2)

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

正如What does the caret (‘^’) mean in C++/CLI?中所述,^是跟踪引用,对于非托管代码中的指针大致相当于*。以unmanagedClass* foo1;unmanagedClass foo2;的方式相同,您可以System::String^ str1;System::String str2;

在没有^的情况下使用时,它遵循与没有*的非托管类相同的规则:使用.而不是->的访问方法。当它离开作用域时自动清理(析构函数处于非托管状态,dispose方法处于托管状态)。

使得使用托管对象而不使用^更难的一件事是,大多数托管对象都没有定义复制构造函数或equals运算符。这些都不会用在C#或VB中,因此通常不会实现。没有它们,就不可能在没有^的情况下为变量赋值,所以通常只限于构造一个对象。

答案 1 :(得分:1)

C ++ / CLI有一个名为"stack semantics"的功能。它用于在C ++中模拟RAII模式,当你声明一个没有^ hat的引用类型的局部变量时,编译器会自动发出对类的析构函数的调用。

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

因为它也没有任何有用的构造函数,所以当你试图在没有帽子的情况下声明它时,你几乎总会得到编译器错误消息。总是戴帽子。