读书人

“茴”字的几种写法C#中静态构造函

发布时间: 2011-12-20 22:26:40 作者: rapoo

“茴”字的几种写法——C#中静态构造函数和静态变量文字执行顺序问题
这个问题是刚刚从网上看到的,说实话可能除了在面试的时候遇到意外,平常还真难遇到,所以对于初学者不理解关系不大,千万不要灰心丧气,只是想说明一个问题:用C#做开发,真的不是仅仅会拖拽控件就算是高手了,不要会使用几个控件出去找不到工作就在那里高喊“精通C#找不到工作”之类的话,也希望大家不要仅仅停留在控件层面。
下面的这个问题,就是考C#基础,代码如下:

C# code
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(出自这里)

[解决办法]
接分慢慢看.
[解决办法]
这个应该是博客园里的吧

曾静看过
[解决办法]
断点看看执行过程
[解决办法]
Ivony

熟悉又陌生 ~
[解决办法]
看过CLR VIA C#后这种问题就能弄明白了了
[解决办法]
呵呵,楼主很有想法,其实我觉得越是ASP.NET做了很久的人,反而越不喜欢拖微软自带的控件了,
[解决办法]
周公最近貌似比较有空啊
[解决办法]
周公是授人以渔的楷模......
[解决办法]
探讨
看过CLR VIA C#后这种问题就能弄明白了了

[解决办法]
我感觉有时这种静态构造的断点好像不管用呢
探讨
断点看看执行过程

[解决办法]
探讨
Ivony

熟悉又陌生 ~

[解决办法]
要仔细看看。。。
[解决办法]
的确,面试的时候就会出一些意外.......................
[解决办法]
看看这是个什么的东西
[解决办法]
探讨
看过CLR VIA C#后这种问题就能弄明白了了

[解决办法]
探讨
引用:

周公最近貌似比较有空啊

最近经常在CSDN/51CTO/cnblogs上面转悠,看看一些最基础的算法题和一些最新的应用,算是把别人用来喝咖啡的时间花在上网学习上了吧。

------解决方案--------------------


探讨
引用:

周公最近貌似比较有空啊

最近经常在CSDN/51CTO/cnblogs上面转悠,看看一些最基础的算法题和一些最新的应用,算是把别人用来喝咖啡的时间花在上网学习上了吧。

[解决办法]
ganxie
[解决办法]
探讨
引用:

周公最近貌似比较有空啊

最近经常在CSDN/51CTO/cnblogs上面转悠,看看一些最基础的算法题和一些最新的应用,算是把别人用来喝咖啡的时间花在上网学习上了吧。

[解决办法]
看看去
[解决办法]
有收获了,向周公学习!
[解决办法]
mark
[解决办法]
这类问题还是值得关注的,平时容易忽略。
[解决办法]
今天才开通的号!新来的期望大家多指教!
[解决办法]
mark
[解决办法]
还没有遇到过这种面试题,如果没看到的话碰到这道题真没底
[解决办法]
呵呵,面试真遇到过
[解决办法]
可以写比这更迷惑的!!
觉得没太大的意义!!
[解决办法]
谢了!
好好研究研究
[解决办法]
接分
回复内容太短了!

[解决办法]
得好好咯~~~
多思考。多~~
[解决办法]
周公真是好人呐
[解决办法]
顶一个~~~
[解决办法]
好好好好好好好好好好
[解决办法]
真是熟悉又陌生,好经典,如果面试遇到真会晕的

[解决办法]
学习,顶,不错
学习,顶,不错
[解决办法]
笔试的时候遇到过这题,一模一样
[解决办法]
挺好的~
容易忽略~
[解决办法]
以前有个差不多的题,这个真想着就有点糊涂了。
[解决办法]
把A类改下,其他的不变。
C# code
public class A{    public static int X = B.Y + 1;    static A()    {            }}
[解决办法]
看了一边........转晕啦...
[解决办法]
之前弄过这种类似的题给别人面试...那哥们当时就了...
[解决办法]
.........
[解决办法]
谢谢楼主分享!
[解决办法]
谢谢楼主分享!
[解决办法]
好吧,其实我是来接分的
------解决方案--------------------


我的理解是:在编译时,就确定了A.x=0和B.y=1
A的静态构造函数在第一次访问时被调用,所以A.x值为2
[解决办法]
有些是基础你不搞清楚搞明白。以后你用的就会很犹豫。更有时候是纠结...
毕竟技术这东西你能多清楚一点,你的运用就会多一点。

多思考,多提问,多上机。这样才有意思。

人一思考上帝就笑了。

也许LZ的目的不是这些,更可能是一种心态的教育吧!

难道下一本书是《程序员心理学》

那也期待下

[解决办法]

探讨

把A类改下,其他的不变。
C# code

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


这样我运行的结果也是一样。X=2,Y=1;

改下B类,其他的不变。
C# code

public class B
{
public static in……

[解决办法]
典型的 周公,支持c#。
[解决办法]
接分慢慢看.喜欢C#
[解决办法]
很早以前自己就发现过这个问题,所以我做对了
[解决办法]
学习了。。。。。。。。。。。。。
[解决办法]
我感觉A类先执行,因为先调用了它。
A执行到构造函数时,先调用B.Y再赋值给A.X,此时A.X还是默认值0,
B.Y就等于1,然后A.X就等于2
[解决办法]
Mark
[解决办法]
探讨
把A类改下,其他的不变。

C# code

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


这样我运行的结果也是一样。X=2,Y=1;

改下B类,其他的不变。

C# code

public class B
{
p……

[解决办法]
没看懂,回帖再慢慢看
[解决办法]
要学的东西还很多啊
[解决办法]
探讨
再次重申:
除了在面试的时候遇到意外,平常还真难遇到,所以对于初学者不理解关系不大,千万不要灰心丧气,只是想说明一个问题:用C#做开发,真的不是仅仅会拖拽控件就算是高手了,不要会使用几个控件出去找不到工作就在那里高喊“精通C#找不到工作”之类的话,也希望大家不要仅仅停留在控件层面。

[解决办法]
呵呵 有意思
[解决办法]
探讨
再次重申:
除了在面试的时候遇到意外,平常还真难遇到,所以对于初学者不理解关系不大,千万不要灰心丧气,只是想说明一个问题:用C#做开发,真的不是仅仅会拖拽控件就算是高手了,不要会使用几个控件出去找不到工作就在那里高喊“精通C#找不到工作”之类的话,也希望大家不要仅仅停留在控件层面。

[解决办法]
很好啊,学习学习
[解决办法]
接分慢慢看.
[解决办法]
先顶再看
[解决办法]
躺到地板上面慢慢学习。。。
[解决办法]
值得学习呀 同志
[解决办法]
惭愧,本来自己认为对静态构造函数理解得还行。却在今天这小题目栽了一下。一直以为输出2和3.后来细想。忽略了静态构造函数在整个应用在就初始化一次的事实。
[解决办法]
嗯嗯嗯 nice
[解决办法]
接分慢慢看.
------解决方案--------------------


接分~~~~~~~~~~~~~~~~~~~~~
[解决办法]
哎呀,没有积分了啊,看看
[解决办法]
每天回帖得10分
[解决办法]

探讨
最近经常在CSDN/51CTO/cnblogs上面转悠,看看一些最基础的算法题和一些最新的应用,算是把别人用来喝咖啡的时间花在上网学习上了吧。

[解决办法]
学控件知其然,学基础理论知其所以然。 精通C#真不是那么容易做到的。
[解决办法]
A写的不太好,声明一个初始值更明显。
C# code
    public class A    {        public static int X=100;        static A()        {            X = B.Y + 1;        }    }
[解决办法]
探讨
惭愧,本来自己认为对静态构造函数理解得还行。却在今天这小题目栽了一下。一直以为输出2和3.后来细想。忽略了静态构造函数在整个应用在就初始化一次的事实。

[解决办法]
多谢楼主的解答与提点.这个问题在我们学习软件开发的时候老师就考过我们了,讲解过一次,那次全班好像只有一两个人做出来了.呵呵!
[解决办法]
探讨

A写的不太好,声明一个初始值更明显。C# code
public class A
{
public static int X=100;
static A()
{
X = B.Y + 1;
}
}


这样打印结果是 102,101。


所谓的“声明时赋初值”只是个障眼法……

[解决办法]
探讨
接分慢慢看.

[解决办法]
看看......
[解决办法]
如果想达到精通和灵活运用
c#语言本身的学习并不简单
[解决办法]
好复杂啊
[解决办法]
同感呀 要学习的太多了
[解决办法]
探讨

还没有遇到过这种面试题,如果没看到的话碰到这道题真没底

[解决办法]
探讨
引用:

惭愧,本来自己认为对静态构造函数理解得还行。却在今天这小题目栽了一下。一直以为输出2和3.后来细想。忽略了静态构造函数在整个应用在就初始化一次的事实。

发这个帖子的目的就是为了让大家抛弃控件发现一些C#基础层面的东西,从你的回答中我感觉我达到这个目标了,呵呵。

[解决办法]
面试时曾经碰到过,没答对
[解决办法]
确实有些细节问题很容易出错
[解决办法]
你分真多啊。
[解决办法]
顶..................
[解决办法]
我翻页

读书人网 >C#

热点推荐