静态构造函数和静态成员变量初始化的调用时间

    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();
    }
单步调试得出结论:静态成员初始化在静态构造函数之前,静态构造函数调用在静态方法前,而静态成员初始化又是在什么时候调用的呢?
    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");
        }
    }

再次跟踪调试。顺序如下,类被首次提到(实例化或调用静态对象/方法)时开始执行类的静态成员初始化,初始化后如果存在静态构造函数则调用静态构造函数,之后进行相应操作。
那么多个静态成员按什么顺序初始化呢
        public static object Something3 = new object();
        
public static object Something1 = new object();
        
public static object Something2 = new object();
顺序3-1-2,也就是编译顺序
这个顺序不知道会不会因为调用有所改变
    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,也就是说不会因为先调用而先初始化。

posted on 2006-06-14 12:50  昊子  阅读(1994)  评论(0编辑  收藏  举报

导航