静态构造函数和静态成员变量初始化的调用时间
class Class1
{
[STAThread]
static void Main(string[] args)
{
System.Console.WriteLine(anobject== null);
System.Console.WriteLine("程序开始");
}
static Class1()
{
System.Console.WriteLine("静态构造函数调用");
}
static readonly object anobject = new object();
}单步调试得出结论:静态成员初始化在静态构造函数之前,静态构造函数调用在静态方法前,而静态成员初始化又是在什么时候调用的呢?
再次跟踪调试。顺序如下,类被首次提到(实例化或调用静态对象/方法)时开始执行类的静态成员初始化,初始化后如果存在静态构造函数则调用静态构造函数,之后进行相应操作。
那么多个静态成员按什么顺序初始化呢
这个顺序不知道会不会因为调用有所改变
{
[STAThread]
static void Main(string[] args)
{
System.Console.WriteLine(anobject== null);
System.Console.WriteLine("程序开始");
}
static Class1()
{
System.Console.WriteLine("静态构造函数调用");
}
static readonly object anobject = new object();
}单步调试得出结论:静态成员初始化在静态构造函数之前,静态构造函数调用在静态方法前,而静态成员初始化又是在什么时候调用的呢?
class Class1
{
[STAThread]
static void Main(string[] args)
{
System.Console.WriteLine(anobject== null);
System.Console.WriteLine("程序开始");
Class2 c2 = new Class2();
c2.Do();
Class2.StaticDo();
}
static Class1()
{
System.Console.WriteLine("静态构造函数调用");
}
static readonly object anobject = new object();
}
public class Class2
{
static Class2()
{
System.Console.WriteLine("Class2静态构造函数");
}
public Class2()
{
}
public void Do()
{
System.Console.WriteLine("Class2实例.Do()");
}
public static object Something = new object();
public static void StaticDo()
{
System.Console.WriteLine("Class2静态方法DO");
}
}
{
[STAThread]
static void Main(string[] args)
{
System.Console.WriteLine(anobject== null);
System.Console.WriteLine("程序开始");
Class2 c2 = new Class2();
c2.Do();
Class2.StaticDo();
}
static Class1()
{
System.Console.WriteLine("静态构造函数调用");
}
static readonly object anobject = new object();
}
public class Class2
{
static Class2()
{
System.Console.WriteLine("Class2静态构造函数");
}
public Class2()
{
}
public void Do()
{
System.Console.WriteLine("Class2实例.Do()");
}
public static object Something = new object();
public static void StaticDo()
{
System.Console.WriteLine("Class2静态方法DO");
}
}
再次跟踪调试。顺序如下,类被首次提到(实例化或调用静态对象/方法)时开始执行类的静态成员初始化,初始化后如果存在静态构造函数则调用静态构造函数,之后进行相应操作。
那么多个静态成员按什么顺序初始化呢
public static object Something3 = new object();
public static object Something1 = new object();
public static object Something2 = new object();
顺序3-1-2,也就是编译顺序public static object Something1 = new object();
public static object Something2 = new object();
这个顺序不知道会不会因为调用有所改变
public class Class2
{
public static object Something3 = Something1;
public static object Something1 = new object();
public static object Something2 = new object();
}
class Class1
{
[STAThread]
static void Main(string[] args)
{
System.Console.WriteLine(Class2.Something3 == null);
}
}
结果Something3的值为null,也就是说不会因为先调用而先初始化。
{
public static object Something3 = Something1;
public static object Something1 = new object();
public static object Something2 = new object();
}
class Class1
{
[STAThread]
static void Main(string[] args)
{
System.Console.WriteLine(Class2.Something3 == null);
}
}