日期:2014-05-20  浏览次数:21080 次

“茴”字的几种写法——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上面转悠,看看一些最基础的算法题和一些最新的应用,算是把别人用来喝咖啡的时间花在上网学习上了吧。

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