从Visual Studio 2013跳转到Visual Studio 2015,我注意到编译器接受托管C ++类中的静态自我实例的方式存在一些差异。考虑以下两个例子:
方法1:
public ref class CResourceManager
{
public:
static property CResourceManager^ Instance
{
CResourceManager^ get() { return %m_Instance; }
}
private:
static CResourceManager m_Instance;
};
方法2:
public ref class CResourceManager
{
public:
static property CResourceManager^ Instance
{
CResourceManager^ get() { return m_Instance; }
}
private:
static CResourceManager^ m_Instance = gcnew CResourceManager;
};
方法1曾经在2013年工作,但它在2015年未能编译。遗憾的是,我没有准确的编译器错误,但它是“变量名前缺少分号”错误之一,基本上说它不能'找到类型CResourceManager
(指向静态变量声明)。
关于我的问题:
答案 0 :(得分:3)
方法2是正确的方法。您列出的代码相当于C#惯用语。
方法1有点不寻常。
^
通常意味着该变量未在托管堆上分配。但是,由于它是一个静态类成员,我不确定它实际创建的位置。%
通常用于声明跟踪引用,相当于在C#中通过ref
或out
传递变量。说实话,我认为将%
应用于没有^
或%
且将结果作为^
的变量甚至无效。 (虽然考虑到2015编译器拒绝它,但可能不会。)即使方法1有效,我仍然会使用方法2:m_Instance
的存储位置及其返回方式既简单,通用且易于理解。这不得不考虑代码如何在任何一天工作。