看到大家都是这么说,而且我经过简单的验证也是这么回事。但是我没研究过clr底层机制,不知道到底是不是这样,是怎么做到的,会不会万一保证不了。希望有研究过sscli的哥们给从最底层给彻底的解释一下。
我的验证代码:
using System;
using System.Xml;
public class Test
{
public static void Main(string[] args)
{
TestStatic.StaticMethod();
Console.ReadLine();
}
}
public class TestStatic
{
static XmlDocument doc;
static TestStatic()
{
doc=new XmlDocument();
doc.Load("Test.xml");//假设此文件存在,而且是一个良好的xml。
}
public static void StaticMethod()
{
//静态构造函数一定会在此方法调用之前执行吗,下面这句有没有可能因为doc为null而抛出NullReferenceException?
XmlNodeList list= doc.ChildNodes;
}
}
谢谢各位兄弟的回答。不过道理我也明白,而且我写的验证代码也证明了是这样,可是为什么会这样啊,底层机制是怎么实现的,希望知道的兄弟给解释一下。
估计是这样的,由于你的方法中,引用的是静态的字段,所以最先在静态构造里面进行
我认为这就是 .net 的 一个固定的执行过程吧。也就是 编写者的一个约定,知道就可以了
1.程序中的主类的静态变量会在main方法执行之前初始化
2.静态对象(变量)在非静态对象前初始化。
3.就算你不创建对象,只是访问类中静态变量,该类中的所有的静态变量也要按顺序初始化。
建议你在研究一下有超类的情况下,你会发现不管如何都是静态变量先初始化。