c ++ / cli ref类和使用句柄的动态分配?

时间:2015-09-29 20:25:49

标签: .net c++-cli

在.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();

这两个类的操作完全相同。以某种方式创建类的实例之间是否有任何真正重要的区别?它们都应该是托管代码吗?第一种方式似乎更容易,并阻止我不得不使用“ - >”运营商。

1 个答案:

答案 0 :(得分:2)

第一种语法称为stack semantics。这模拟了标准C ++中的堆栈分配。在离开范围时,包括引发异常时,对象将自动处理。这是一个很好的语法方便,但在引擎盖下,这两个对象实际上都是在托管堆上实例化的。我个人只使用第一种语法和一次性类型,例如数据库连接。

至于差异,如果必须将它传递给需要句柄类型的某个方法,则必须使用%一元运算符将使用堆栈语义声明的实例转换为其基础句柄类型。