当我遵循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);
}
}
}