求一个测试题答案和解释 重要的是解释

dannyrz 2010-03-07 11:45:47
class A
{
public A(){
PrintFields();
}
public virtual void PrintFields(){}
}
class B : A
{
int x = 1;
int y;
public B()
{
y = -1;
}
public override void PrintFields()
{
Console.WriteLine("x={0},y={1}", x, y);
}
}
class Program
{
static void Main(string[] args)
{
B b = new B();
}
}
...全文
82 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
cshava 2010-03-07
  • 打赏
  • 举报
回复
看了程序后觉得是x=1 y=0,但没什么信心,运行后果真如此

构造类的实例时会先执行其基类的构造函数,再执行自己的,所以PrintFields()时y还未赋为-1,声明int y时y就是默认值0

PS:
B b = new B(); 很别扭,“new B”......
dannyrz 2010-03-07
  • 打赏
  • 举报
回复
引用 3 楼 dopsop110 的回复:
http://topic.csdn.net/u/20090709/17/170d875e-5e38-45eb-8693-ee4e2b8dbd77.html参考


我这里的例子和你不是同一个

我这里的结果是 x=1 y=0
amandag 2010-03-07
  • 打赏
  • 举报
回复
成员的初始化动作早于构造函数赋值
dopsop110 2010-03-07
  • 打赏
  • 举报
回复
类被第一次使用时才会执行类静态成员初始化,而类静态成员初始化时,先执行静态初始化字段,再执行静态构造函数。

Main函数因为是入口函数被宿主进程调用,由于Main是B的静态成员则按规则在调用前先初始化静态字段,也就是先执行Y = A.X + 1, 在计算表达式过程中需要用到A.X,执行点被转移到对A的静态成员初始化,A没有需要静态初始化的字段,就直接执行静态构造函数的X = B.Y + 1,B.Y还未完成初始化根据语言特性默认为0,此时X被初始化为1,然后Y就马上被初始化为2。
程序员鼓励师 2010-03-07
  • 打赏
  • 举报
回复
aofengdaxia 2010-03-07
  • 打赏
  • 举报
回复
问题呢??还是说给你解释运行的结果?

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧