c# - 为什么实例构造函数先运行?

标签 c# .net

我遇到了一个我想了解的 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");
        }
    }

输出:

Instance Constructor

Static Constructor

最佳答案

它不会先运行,只是看起来好像会运行。你写的(大致)等同于

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 调用之前)的原因很简单:静态构造函数的其余部分可能依赖于那些已初始化的字段。

关于c# - 为什么实例构造函数先运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50079980/

相关文章:

c# - JsonCovertor反序列化时自动选择参数化构造函数

c# - C# 中英寸、英尺和码的距离转换器

c# - 为什么我们使用参数传递值?

c# - 将图像和数据作为多部分内容上传 - Windows Phone 8

c# - 为什么 System.Math 有用于 Sin、Cos 等的外部方法?

c# - 如何在 UWP 中检查有线互联网连接?

c# - 向 SQLite 表添加列不使用完整的项目名称

c# - 如何在文件的一部分上使用 DeflateStream?

c# - 此命名空间冲突是由于 XAML 到 .NET 代码生成中的错误造成的吗?

c# - Entity Framework 6 : ignore property on basetype for all derived types