这两个定义之间有什么区别:
using namespace System;
String^ ToStringA(char* str)
{
return gcnew String(str);
}
String^ ToStringB(char* str)
{
return %String(str);
}
我的猜测是在后者中使用“堆栈语义”创建System::String
以使用%
- 运算符返回对该对象的引用,因此它与前者完全相同。真的吗?任何细微之处?
gcnew
- 方式在这里可能更清晰,因此更受欢迎,但以下内容如何:
String^ ToString2A(char* str1, char* str2)
{
return gcnew String(str1) + gcnew String(str2);
}
String^ ToString2B(char* str1, char* str2)
{
return %String(str1) + %String(str2);
}
可以进行任何其他处理而不仅仅是连接。有什么理由不使用%
?
奖金问题:为什么the docs表示String
没有堆栈语义,这甚至可以正常工作?
答案 0 :(得分:2)
堆栈语义是纯粹的编译器功能,它在生成的MSIL中完全消失。编译器自动生成所需的gcnew
以创建String对象。并且通常会自动生成Dispose()调用,但在这种情况下不会,因为String类型不实现IDisposable。
您只需要%
运算符来保持编译器满意,它实际上不会产生任何代码。自动生成的String对象已经是引用类型。
因此两个片段完全相同并生成完全相同的MSIL。你可以通过像ildasm这样的反编译器来查看它。
支持最具可读性和逻辑性的版本。肯定是第一个,在非一次性类型上使用堆栈语义是没有意义的,只会混淆任何读取代码的人的填充。但这取决于你。