在.NET的C ++版本中,我们可以通过以下方式声明一个类:
ref class CoolClass
{
public:
String^ GetName()
{ return name;}
void SetName(String^ n)
{name = n;}
private:
String^ name;
}
当我们以这种方式创建类时,将使用clr的垃圾收集器在托管堆上创建和管理类的实例。
现在,假设我创建了2个动物类实例。
Animal cat;
Animal ^dog = gcnew Animal();
这两个类的操作完全相同。以某种方式创建类的实例之间是否有任何真正重要的区别?它们都应该是托管代码吗?第一种方式似乎更容易,并阻止我不得不使用“ - >”运营商。
答案 0 :(得分:2)
第一种语法称为stack semantics。这模拟了标准C ++中的堆栈分配。在离开范围时,包括引发异常时,对象将自动处理。这是一个很好的语法方便,但在引擎盖下,这两个对象实际上都是在托管堆上实例化的。我个人只使用第一种语法和一次性类型,例如数据库连接。
至于差异,如果必须将它传递给需要句柄类型的某个方法,则必须使用%一元运算符将使用堆栈语义声明的实例转换为其基础句柄类型。