“C#静态变量的诡异与恶心”之我见

今天看到了一个帖子题目说是"C#静态变量的诡异与恶心 "

我也说说我的看法,看下面的C#代码

   1. using System;  
   2.   
   3. namespace StaticTest  
   4. {  
   5.     class A  
   6.     {  
   7.         public static int X;  
   8.         static A()  
   9.         {  
  10.             X = B.Y + 1;  
  11.         }  
  12.     }  
  13.     class B  
  14.     {  
  15.         public static int Y = A.X + 1;  
  16.         static B()  
  17.         {  
  18.         }  
  19.         static void Main()  
  20.         {  
  21.             Console.WriteLine("X={0}, Y={1}", A.X, B.Y);  
  22.         }  
  23.     }  
  24. }  

 打印结果为X= 1 , Y= 2

第二个例子,java代码

   1. class StaticTest  
   2. {  
   3.     public static void main(String[] args){  
   4.         System.out.println(Integer.toString(A.X) +" "+Integer.toString(B.Y));  
   5.     }  
   6. }  
   7.   
   8. class A  
   9. {  
  10.     static int X = B.Y + 1;  
  11. }  
  12.   
  13. class B  
  14. {  
  15.     static int Y = A.X + 1;  
  16. }  
打印的结果为 2 1
结果看上去挺诡异的,其实还是需要分析一下
C#与java差不多,不分开讲
对于第一个例子,
1 在运行main之前,所有的变量进行默认初始化,X=0,Y=0
2 为了运行main方法,需要对类B进行静态初始化
3 B静态初始化,需要初始化静态变量Y
4 Y的初始化需要用到A的变量X,需要初始化类A
5 A的初始化时,又需要用到了Y变量,而此时类B早已经开始初始化,故不会再对B初始化,避免循环
6 直接取Y=0,得到X=1
7 然后返回后Y再被初始化为2
对于第二个例子
1 在运行main之前,所有的变量进行默认初始化,X=0,Y=0
2 由于需要调用A.X,故需要对A进行静态初始化
3 A中使用Y,对B进行初始化
4 B中又用到X,但由于A已经开始初始化,故不循环,直接取X=0,得到Y=1
5 然后得到X=2
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值