我一直很好奇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 ^ ?
感谢。
答案 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
。