关于两个笔试题

mm1543 2008-04-01 08:47:55
看到这样的两个笔试题,没有太明白,麻烦高手帮忙解释一下,先谢了!
1、 using System;
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);
}
当使用new B()创建B的实例时,产生什么输出?
答:X=1,Y=0
2.下面的例子中
using System;
class A
{
public static int X;
static A(){
X=B.Y+1;
}
}
class B
{
public static int Y=A.X+1;
static B(){}
static void Main(){
Console.WriteLine("X={0},Y={1}",A.X,B.Y);
}
}
产生的输出结果是什么?
答:x=1,y=2
...全文
476 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
badx398944782 2008-04-02
  • 打赏
  • 举报
回复
收藏
qinqinhao 2008-04-02
  • 打赏
  • 举报
回复
学习中
hyunwung 2008-04-02
  • 打赏
  • 举报
回复
经典的逻辑题。构造,多态,重载都涉及到了!!
fangfu110 2008-04-02
  • 打赏
  • 举报
回复
呵呵,调试了一会,收藏
shiyuzh2007 2008-04-02
  • 打赏
  • 举报
回复
在调用静态构造函数之前,需要先对静态字段赋值。
yang191751 2008-04-02
  • 打赏
  • 举报
回复
有趣!
virusswb 2008-04-02
  • 打赏
  • 举报
回复
静态构造函数是用来初始化静态变量的,所以A.X就是1了
那B.Y就是A.X+1=2
virusswb 2008-04-02
  • 打赏
  • 举报
回复
总是先构造自己的父类,就是先调用父类的构造,不过在调用之前要先初始化字段,然后在调用
lds19840827 2008-04-02
  • 打赏
  • 举报
回复
勉強します!
zjpation 2008-04-02
  • 打赏
  • 举报
回复
mark
jeremyliu821 2008-04-02
  • 打赏
  • 举报
回复
mark
nnoovvee 2008-04-01
  • 打赏
  • 举报
回复
mark
DirectRay 2008-04-01
  • 打赏
  • 举报
回复
而实际上,第二题是首先加载B类的代码到内存中,因为Main在B类里面。依照顺序执行的时候,发现了A.X,这时候A尚未出现,于是去找A。A加载到内存。此时X为0.B已存在,Y未赋值,自然为0.A静态部分构造完成后,X为1.回到B,此时Y = 1 + 1,也就是2.于是得到输出,X = 1,Y = 2。

如果需要证明,可以执行本人修改的代码如下:


class A
{
public static int X;
static A(){
Console.WriteLine("in A static,X is " + X.ToString());
X=B.Y+1;
Console.WriteLine("in A static again,X is " + X.ToString());
}
}
class B
{
public static int Y=A.X+1;
static B()
{
Console.WriteLine("in B static,Y is " + Y.ToString());
}
static void Main(){
Console.WriteLine("X={0},Y={1}",A.X,B.Y);
}
}
DirectRay 2008-04-01
  • 打赏
  • 举报
回复
mark,收藏。

关于第二题,静态构造函数优先于普通构造函数执行,完毕。
Sunny_Jane 2008-04-01
  • 打赏
  • 举报
回复
不是很明白
shiyuzh2007 2008-04-01
  • 打赏
  • 举报
回复
对于第二题,我也不太通,但我刚好看到了一本书上有这个原题目,对其的解释可参见孙永强 戴锋等编的《Visual C# .NET程序设计基础》第124面例6.15,内容有点长,就不敲出来了。主要是因为静态构造函数的原因。
JYYCOM 2008-04-01
  • 打赏
  • 举报
回复
受益匪浅,自己在。net中调试了一下,发现真的跟原先想象的不一样。
shiyuzh2007 2008-04-01
  • 打赏
  • 举报
回复
c#中,对于没有赋值的类的实例字段,系统会默认将其赋值为0;
例如:
class A
{
public int a;
public static void Main()
{
A test=new A();
Console.WriteLine("a={0}",test.a);
}
}
输出结果是:0
然后在C#里,在调用构造函数之前先赋值,
可以通过这个例子验证:
class A
{
int a = 1;
A()
{
Print();
a = 50;
Print();
}

void Print()
{
Console.WriteLine("a={0}",a);
}
public static void Main()
{
A test = new A();
}
}
同时,C#调用子类的构造函数时先调用父类的构造函数。知道了这些,第一个问题就很好解决了!
我姓区不姓区 2008-04-01
  • 打赏
  • 举报
回复
1、因为AB都没有静态变量与静态构造函数,所以先初始化派生类B的非静态变量,故x=1,y=0,然后初始化基类A的非静态构造函数,在A的构造函数中调用了一个虚拟函数,此时B还没有构造完毕,所以调用了派生类的重写函数,输出结果,此时x=1,y=0。然后再进行派生类B的非静态构造函数,此时y才等于-1
2、程序入口在B类中,首先初始化静态变量Y,Y需要调用A的静态变量X,则对A进行构造对象,首先初始化A的静态变量X,X=0,然后初始化A的静态构造函数,此时Y=0,所以X=0+1=1,A构造完成,回到B,Y=1+1=2,然后再进行B的静态构造函数,但什么也没做,然后输出结果,X=1,Y=2
cc_net 2008-04-01
  • 打赏
  • 举报
回复
mark
加载更多回复(12)

110,570

社区成员

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

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

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