C#对象初始化顺序 总结
public class BaseA
{
public static MyTest a1 = new MyTest("a1");
public MyTest a2 = new MyTest("a2");
static BaseA()
{
MyTest a3 = new MyTest("a3");
}
public BaseA()
{
MyTest a4 = new MyTest("a4");
}
public virtual void MyFun()
{
MyTest a5 = new MyTest("a5");
}
}
public class BaseB : BaseA
{
public static MyTest b1 = new MyTest("b1");
public MyTest b2 = new MyTest("b2");
static BaseB()
{
MyTest b3 = new MyTest("b3");
}
public BaseB()
{
MyTest b4 = new MyTest("b4");
}
public new void MyFun()
{
MyTest b5 = new MyTest("b5");
}
}
static class Program
{
static void Main()
{
BaseB baseb = new BaseB();
baseb.MyFun();
}
}
public class MyTest
{
public MyTest(string info)
{
Console.WriteLine(info);
}
}
b继承于a,则初始化顺序如下:
1、子类b静态变量初始化。2、子类b静态构造函数初始化。3、子类b非静态变量初始化。
4、父类a静态变量初始化。5、父类a静态构造函数初始化。 6、父类a非静态变量初始化。
7、父类a非静态构造函数初始化。8、子类b非静态构造函数初始化
上面代码输出顺序为:b1 b3 b2 a1 a3 a2 a4 b4 b5
=========================
变量的初始化
1、变量是类或结构中的字段,如果没有显式初始化,则编译器会在创建变量时,把变量初始化为默认值。
a、对于整型、浮点型、枚举类型(数值型),默认值为0或0.0。
b、字符类型的默认值为\x0000。
c、布尔类型的默认值为false。
d、引用类型的默认值为null。
这种特性虽然能够避免编译错误,但是违背了变量的“先赋值、后使用”原则,这些“无害的”默认值很容易产生难以识别的错误,建议尽可能地在构造函数中对所有成员变量赋值。
2、变量是方法中的局部变量,必须在代码中显式初始化,之后才能使用。否则会发生“使用了未赋值的局部变量”的错误。
==============
参考:http://www.cnblogs.com/hkncd/archive/2011/06/05/2073404.html
浙公网安备 33010602011771号