C# - 静态只读未初始化

时间:2017-06-12 11:56:51

标签: c# .net-4.5

当我遵循Singleton方法并且我不明白这里发生了什么时,我遇到了静态初始化的问题。目标框架是4.5。这是一个全新的项目。没有修改任何设置。

这里我做了一个有问题的代码示例,预期结果是“静态值”应出现在控制台上。然而,什么也没出现。调试实际上表明,在Console.Write时,静态变量Static_Value为null。

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            Test MyClass = Test.Instance;

            Console.ReadKey();
        }
    }

    class Test
    {
        public static Test _instance = new Test();

        public static Test Instance
        {
            get { return _instance; }
        }

        public static readonly string Static_Value = "Static Value";

        static Test()
        {

        }

        private Test()
        {
            Console.Write(Static_Value + Environment.NewLine);
        }
    }
}

如果我放弃单身方法,它就可以了。

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            Test MyClass = new Test();

            Console.ReadKey();
        }
    }

    class Test
    {
        public static Test _instance = new Test();

        public static Test Instance
        {
            get { return _instance; }
        }

        public static readonly string Static_Value = "Static Value";

        public Test()
        {
            Console.Write(Static_Value + Environment.NewLine);
        }
    }
}

我对这里发生的事情感到很困惑。是否在第一次访问静态变量时初始化它们?因为它似乎没有发生......

有人能在这里说清楚吗?

编辑:

按照RenéVogt提示,我根据标准修改了我的代码,现在可以了。由于静态构造函数运行时会考虑所有静态​​初始化器的副作用,因此我将_instance的初始化移动到静态构造函数,该构造函数将在实例的getter运行之前运行。

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            Test MyClass = Test.Instance;

            Console.ReadKey();
        }
    }

    class Test
    {
        private static Test _instance;

        public static Test Instance
        {
            get { return _instance; }
        }

        public static readonly string Static_Value = "Static Value";

        static Test()
        {
            _instance = new Test();
        }

        private Test()
        {
            Console.Write(Static_Value + Environment.NewLine);
        }
    }
}

0 个答案:

没有答案