一道关于实例化顺序的C#面试题

转自http://kb.cnblogs.com/page/104476/

 1 public class BaseA
 2 {
 3     public static MyTest a1 = new MyTest("a1");
 4     public MyTest a2 = new MyTest("a2");
 5     static BaseA()
 6     {
 7         MyTest a3 = new MyTest("a3");
 8     }
 9     public BaseA()
10     {
11         MyTest a4 = new MyTest("a4");
12     }
13     public virtual void MyFun()
14     {
15         MyTest a5 = new MyTest("a5");
16     }
17 }
18 public class BaseB : BaseA
19 {
20     public static MyTest b1 = new MyTest("b1");
21     public MyTest b2 = new MyTest("b2");
22     static BaseB()
23     {
24         MyTest b3 = new MyTest("b3");
25     }
26     public BaseB()
27     {
28         MyTest b4 = new MyTest("b4");
29     }
30     public new void MyFun()
31     {
32         MyTest b5 = new MyTest("b5");
33     }
34 }
35 static class Program
36 {
37     static void Main()
38     {
39         BaseB baseb = new BaseB();
40         baseb.MyFun();
41     }
42 }
43 public class MyTest
44 {
45     public MyTest(string info)
46     {
47         Console.WriteLine(info);
48     }
49 }

 

  最后的问题是:请写出Main()方法中,a1-a5,b1-b5这十个类实例化的顺序。(MyTest类是我自己添的,方便查看结果,原题是是实例化一个object类。)

这个答对了。

C#里没有接触,倒是在JAVA里看过

类的加载及初始化

静态构造块(静态属性,主要功能是为类的对象共享),静态构造函数(静态构造函数只在类对象第一次创建实例时执行,多是为静态属性赋初值),构造块,构造函数

所以上面的答案是 

1      b1 B类的 静态构造块
2  b3 B类的 静态构造方法
3  b2 B类的 构造块
4  a1 A类的 静态构造块,这里是执行B类的构造方法,我们知道,要先执行父类的初始化,再执行本类的构造方法,4-7是A类的初始化。
5  a3 A类的 静态构造方法
6  a2 A类的 构造块
7  a4 A类的 构造方法
8  b4 B类的 构造方法
9  b5 B类的 Myfun方法。

这里有个无关的小知识点。
 public new void MyFun()
new 修饰符
在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员
posted @ 2013-06-16 10:37  cclient  阅读(190)  评论(0编辑  收藏  举报