您的位置:首页 > 职场人生

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

2013-06-16 10:37 573 查看
转自http://kb.cnblogs.com/page/104476/

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);
}
}


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

这个答对了。

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

类的加载及初始化

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

所以上面的答案是

1 b1 B类的 静态构造块
2  b3 [b]B类的 静态构造方法

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

这里有个无关的小知识点。

public new void MyFun()

new 修饰符
在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: