“茴”字的几种写法——C#中静态构造函数和静态变量文字执行顺序问题

周公
博客专家认证
2010-04-02 01:29:08
加精
这个问题是刚刚从网上看到的,说实话可能除了在面试的时候遇到意外,平常还真难遇到,所以对于初学者不理解关系不大,千万不要灰心丧气,只是想说明一个问题:用C#做开发,真的不是仅仅会拖拽控件就算是高手了,不要会使用几个控件出去找不到工作就在那里高喊“精通C#找不到工作”之类的话,也希望大家不要仅仅停留在控件层面。
下面的这个问题,就是考C#基础,代码如下:

using System;

public class A
{
public static int X;
static A()
{
X = B.Y + 1;
}
}


public class B
{
public static int Y = A.X + 1;
static B()
{
}
}

public class C
{
public static void Main()
{
Console.WriteLine( "X={0},Y={1}", A.X, B.Y );
}
}

问题:请问编译后执行,输出结果是多少?
答案是:X=2,Y=1
解释(来自于网上):
1.其实关于静态构造函数的题目,以前也见过,主要是考察静态构造函数和构造函数执行先后顺序的理解。这道题目倒是别出心裁,升级成了两个类型的静态构造函数和静态成员初始化执行先后顺序。
我们都知道静态成员初始化和静态构造函数编译后都是静态构造函数的一部分,而静态构造函数在类型被加载时执行,这道题目的头疼之处在于,并不是很明显能看出到底是A类加载在前还是B类加载在前。如果A类加载在前,则执行A类的静态构造函数的时候,必然会加载B类型,换言之在B.Y + 1这个表达式有结果前,B类型必须被加载,所以Y = 0(X默认为零) + 1 = 1,X = 1(Y被初始化) + 1 = 2。如果B类初始化在前,则结果恰恰相反。最后我认为A类将加载在前,结果应该是X=2,Y=1。但实际上心里并没底。——Ivony(出自:这里
2.Main方法是程序的入口,Console.WriteLine( "X={0},Y={1}", A.X, B.Y );中先访问的是A.X,因为X是静态的成员所以在访问X之前A的静态构造函数必定已经执行完成,A的静态构造函数中又访问了B.X,同理在A的静态构造函数中获得B.Y的值之前B的静态构造函数必定已经执行完成,由于在完成A的静态构造函数中X=B.Y + 1的中途中执行流程跳到了B的静态构造函数,所以此时A.X还是默认值0,接着在B的静态构造函数被执行完成后得以在A的静态函数中成功获得B.Y,此时B.Y=A.X + 1=0+1=1,接着A.X=1+1=2
所以输出的是X=2,Y=1
我有次面试也遇到这个题目,我给出个结果后面自己注释了个“//不肯定”因为脑子被搞乱了,面试官看了答的结果后问我为什么,因为我可能是蒙对了,我承认了输出结果我是蒙的,但是我用自己知道的关于静态方法的知识回答了他问的为什么的问题,我用了正确的执行流程在大脑中执行了这个过程,但是由于当时很紧张并不能肯定自己执行出的结果。
——Xuefly(出自这里
...全文
1914 167 打赏 收藏 转发到动态 举报
写回复
用AI写文章
167 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzw3423343 2010-05-17
  • 打赏
  • 举报
回复
不错,受教了
dhttaso 2010-05-16
  • 打赏
  • 举报
回复
学个半路出家,现在面临毕业
lickly_loe 2010-05-04
  • 打赏
  • 举报
回复
其实,直接赋个值并不比不赋值差,不知道为什么大家不喜欢开始赋值?
想考什么呀??
破解C#的编译器吗-----干脆自己写一个好了
LovePurple 2010-05-03
  • 打赏
  • 举报
回复
顶~~~~~~~~~~~~~~~学习一下~~
liudongyue1987 2010-04-12
  • 打赏
  • 举报
回复
学习。。。。。。。。。。。。。
blood_akm 2010-04-07
  • 打赏
  • 举报
回复
值得学习呀 同志
sky-defender 2010-04-07
  • 打赏
  • 举报
回复
记下来慢慢看
SlaughtChen 2010-04-07
  • 打赏
  • 举报
回复
接分慢慢看.
社会栋梁 2010-04-07
  • 打赏
  • 举报
回复
友情支持
jiangseraph 2010-04-07
  • 打赏
  • 举报
回复
学习....................
taikonhmao67 2010-04-07
  • 打赏
  • 举报
回复
是不是 先执行静态构造函数,在执行其他
www1240 2010-04-07
  • 打赏
  • 举报
回复
以前学过,现在都忘记了,谢谢楼主
zhuoyue 2010-04-07
  • 打赏
  • 举报
回复
路过学习
itliyi 2010-04-06
  • 打赏
  • 举报
回复
[Quote=引用 45 楼 zhoufoxcn 的回复:]
引用 32 楼 koukoujiayi 的回复:

可以写比这更迷惑的!!
觉得没太大的意义!!

所以我以“茴”字的几种写法作为标题,我感觉实际上用途不是太大。
[/Quote]
wosizy 2010-04-06
  • 打赏
  • 举报
回复
先跟个贴......
zls636 2010-04-06
  • 打赏
  • 举报
回复
#24 面试没答对会怎么样?#35
kakajay008 2010-04-06
  • 打赏
  • 举报
回复
只为积分而来,坐下来慢慢看
beedenis 2010-04-06
  • 打赏
  • 举报
回复
孔乙己啊。。。。
stlsm 2010-04-06
  • 打赏
  • 举报
回复
看着头昏,不用这么写代码的吧
中發白 2010-04-06
  • 打赏
  • 举报
回复
时常看帖,不常回帖!改变一下了。。
加载更多回复(144)

110,533

社区成员

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

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

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