System::String^ ex;
和System::String ex1;
之间的实际区别是什么?
我发现那个" ^"意味着它是顶级的。但这意味着什么?
答案 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类,它没有析构函数。
因为它也没有任何有用的构造函数,所以当你试图在没有帽子的情况下声明它时,你几乎总会得到编译器错误消息。总是戴帽子。