C#类里面的static变量,不会在程序启动时就初始化吗?

时间:2022-10-17 00:42:43
下面的几行程序:

    public class Singleton
    {
        public Singleton() { Console.WriteLine("ctor\n"); }
        private static readonly Singleton instance = new Singleton();
    }

    class Program
    {
        static void Main(string[] args)
        {
        }
    }

什么输出也没有。我期待的是,类的static成员总是会被初始化的,也就是会有"ctor"这样的输出啊。
我的理解错在哪里?

5 个解决方案

#1


Singleton singleton = Singleton.instance;此时会输出ctor。

#2


可以肯定的是静态成员一定是在实例成员以前进行初始化.

你声明了静态的instance,但是该类并没有被使用。

该类没有被调用,也就不会执行任何一次实例化。所以,静态成员也就没有机会初始化。

#3


静态构造方法会在静态成员第一被使用之前执行一次

#4


引用 2 楼 u013235485 的回复:
可以肯定的是静态成员一定是在实例成员以前进行初始化.

你声明了静态的instance,但是该类并没有被使用。

该类没有被调用,也就不会执行任何一次实例化。所以,静态成员也就没有机会初始化。


也就是说,不会像C程序那样,全局变量会在main函数之前就初始化。

而是,类内部的函数或者static变量,没有对类的调用,也不会去初始化static变量。我发现如果有了一个static函数的调用,那么类的static变量就会被初始化了:

    public class Singleton
    {
        public Singleton() { Console.WriteLine("ctor\n"); }
        private static readonly Singleton instance = new Singleton();
        public static void func(){ Console.WriteLine("func\n");}
    }
    class Program
    {
        static void Main(string[] args)
        {
            Singleton.func();
        }
    }

程序输出ctor然后是func
多谢。

#5


客气了。。。

#1


Singleton singleton = Singleton.instance;此时会输出ctor。

#2


可以肯定的是静态成员一定是在实例成员以前进行初始化.

你声明了静态的instance,但是该类并没有被使用。

该类没有被调用,也就不会执行任何一次实例化。所以,静态成员也就没有机会初始化。

#3


静态构造方法会在静态成员第一被使用之前执行一次

#4


引用 2 楼 u013235485 的回复:
可以肯定的是静态成员一定是在实例成员以前进行初始化.

你声明了静态的instance,但是该类并没有被使用。

该类没有被调用,也就不会执行任何一次实例化。所以,静态成员也就没有机会初始化。


也就是说,不会像C程序那样,全局变量会在main函数之前就初始化。

而是,类内部的函数或者static变量,没有对类的调用,也不会去初始化static变量。我发现如果有了一个static函数的调用,那么类的static变量就会被初始化了:

    public class Singleton
    {
        public Singleton() { Console.WriteLine("ctor\n"); }
        private static readonly Singleton instance = new Singleton();
        public static void func(){ Console.WriteLine("func\n");}
    }
    class Program
    {
        static void Main(string[] args)
        {
            Singleton.func();
        }
    }

程序输出ctor然后是func
多谢。

#5


客气了。。。