C ++ / CLI Generic :: Dictionary声明语法

时间:2010-12-06 02:43:07

标签: syntax dictionary c++-cli declaration

我一直很好奇Collections :: Generic :: Dictionary的声明语法 C ++ / CLI中的类。

通常我们在类中声明一个引用并初始化它:

public ref class CDemo {
    private: ClassA ^ m_InstanceA;

    // Why the absence of '^'.
    private: Dictionary<int, int> m_Dic;

    CDemo() : 
        m_InstanceA(gcnew ClassA()),   
        m_Dic(gcnew Dictionary<int, int>()) 
    {...}
};

有人可以解释一下为什么'^'不在那里?

更重要的是,如果我将上面的字典用作另一个字典的 TValue , 我必须这样声明:

Dictionary<T, Dictionary<T, T>^ > m_Dic;  // A '^' in the TValue parameter, which is           
                                          // normal, but same question as above,
                                          // I don't have to declare m_Dic as ^ ?

感谢。

1 个答案:

答案 0 :(得分:3)

这不是Dictionary特有的。此语法是一种帮助将C ++语义映射到托管类型的方法。一般来说:

ref class A
{
   ReferenceType m_obj;
}; 

大致相当于

class A : IDisposable
{
  private ReferenceType m_obj;
  void Dispose() { m_obj.Dispose(); }
}
如果 ReferenceType实现IDisposable,则在C#

。写完

是完全可能的
ref class A
{
   ReferenceType^ m_obj;
};

这没有隐式IDisposable支持。另一个区别是您可以从方法返回ReferenceType^,仅使用普通ReferenceType不支持此方法。例如:

ref class A
{ 
   ReferenceType^ m_obj;
   ReferenceType^ GetIt() { return m_obj; }
};

将编译,

ref class A
{
   ReferenceType m_obj;
   ReferenceType GetIt() { return m_obj; }  // won't compile
   ReferenceType^ OtherGetIt() { return m_obj; } // neither will this
};

为自动(堆栈变量)提供了类似的区别

      ReferenceType local;
      local.Stuff();

被编译器去了

      try {
        ReferenceType^ local = gcnew ReferenceType();
        local->Stuff();
      } finally {
        delete local; // invokes Dispose() (~ReferenceType)
      }

这些功能将熟悉的RAII习惯用于带有托管类型的C ++ / CLI。

编辑:

是的,IDisposable的Dispose方法类似于C ++析构函数。如果ReferenceType没有实现IDisposable(没有dtor),并且它是唯一的成员,那么A也不会实现IDisposable(没有隐含析构函数)。在C ++ / CLI中,您可以通过提供dtor(对于托管类型)来实现IDisposable