在托管 C++ 中,在 class 中定义静态单例实例的正确方法是什么?

In Managed C++, what is the proper way to define a static singleton instance in a class?

从 Visual Studio 2013 年跳到 Visual Studio 2015 年,我注意到编译器接受托管 C++ 类 中的静态自实例的方式存在一些差异。考虑这两个例子:

方法一:

public ref class CResourceManager
{
public:
    static property CResourceManager^ Instance
    {
        CResourceManager^ get() { return %m_Instance; }
    }

private:
    static CResourceManager m_Instance;
};

方法二:

public ref class CResourceManager
{
public:
    static property CResourceManager^ Instance
    {
        CResourceManager^ get() { return m_Instance; }
    }

private:
    static CResourceManager^ m_Instance = gcnew CResourceManager;
};

方法 1 曾在 2013 年工作,但在 2015 年无法编译。不幸的是,我手边没有确切的编译器错误,但这是 "Missing semicolon before variable name" 错误之一,基本上说它不能' t 找到类型CResourceManager(指向静态变量声明)。

继续我的问题:

  1. 方法 1 是否应该在托管 C++ 中工作或有效?
  2. 为什么第二种方法在 2015 年有效,而第一种方法无效(即有什么区别)?
  3. 哪种方法是实现最终目标的正确方法?

方法2是正确的方法。您列出的代码等同于 C# 习惯用法。

方法一有点不一般。

  • 声明中缺少 ^ 通常意味着该变量未分配到托管堆上。但是,由于它是一个静态 class 成员,我不确定它实际是在哪里创建的。
  • % 通常用于声明跟踪引用,相当于在 C# 中通过 refout 传递变量。老实说,我不认为将 % 应用于没有 ^% 的变量并将结果作为 ^ 甚至是有效的。 (虽然考虑到 2015 编译器拒绝它,但它可能不是。)

即使方法一可行,我还是会选择方法二:m_Instance的存储位置和返回方式都比较通俗易懂。这比每天都必须考虑代码如何工作要好。