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,但是该类并没有被使用。
该类没有被调用,也就不会执行任何一次实例化。所以,静态成员也就没有机会初始化。
你声明了静态的instance,但是该类并没有被使用。
该类没有被调用,也就不会执行任何一次实例化。所以,静态成员也就没有机会初始化。
#3
静态构造方法会在静态成员第一被使用之前执行一次
#4
也就是说,不会像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,但是该类并没有被使用。
该类没有被调用,也就不会执行任何一次实例化。所以,静态成员也就没有机会初始化。
你声明了静态的instance,但是该类并没有被使用。
该类没有被调用,也就不会执行任何一次实例化。所以,静态成员也就没有机会初始化。
#3
静态构造方法会在静态成员第一被使用之前执行一次
#4
也就是说,不会像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
客气了。。。