我想遇到一个我想了解的C#行为。
为什么在两种情况下实例构造函数都先运行?
class Program
{
public static void Main()
{
//Singleton s = new Singleton(); case 1
var test = Singleton.Instance; // case 2
}
}
class Singleton
{
static readonly Singleton _instance = new Singleton();
public static Singleton Instance { get { return _instance; } }
private Singleton()
{
Console.WriteLine("Instance Constructor");
}
static Singleton()
{
Console.WriteLine("Static Constructor");
}
}
输出:
实例构造函数
静态构造函数
答案 0 :(得分:7)
它不会先运行,它看起来就好像它一样。你写的是(大致)等同于
class Singleton
{
static readonly Singleton _instance;
public static Singleton Instance { get { return _instance; } }
private Singleton()
{
Console.WriteLine("Instance Constructor");
}
static Singleton()
{
_instance = new Singleton();
Console.WriteLine("Static Constructor");
}
}
也就是说,实例构造函数在静态构造函数执行时被称为。
在静态构造函数中首先发生字段初始化(在Console.WriteLine
调用之前)的原因很简单:静态构造函数的其余部分可能依赖于那些已经初始化的字段。
答案 1 :(得分:0)
构造函数创建对象。此操作打印第一行单词。
private Singleton()
{
Console.WriteLine("Instance Constructor");
}
然后调用单例类的静态实例,打印第二行代码。