zoukankan      html  css  js  c++  java
  • C#类中static变量

    using   System;   
      namespace   Param   
      {   
      class   Class1   
      {   
      static   int   i   =   getNum();   
      int   j   =   getNum();   
      static   int   num   =   1;   
      static   int   getNum()   
      {   
      return   num;   
      }   
      [STAThread]   
      static   void   Main(string[]   args)   
      {   
      Console.WriteLine(string.Format("i={0}",i));   
     

      Console.WriteLine(string.Format("j={0}",new   Class1().j));  

      Console.Read(); 
     

      }   
      }   
      }   
      上面的代码是一个网友告诉我的,让我看看结果,我看了一眼马上说结果是   
      i=1   
      j=1   
      网友运行后说结果是   
      i=0   
      j=1   
      我吓了一跳,认真看了代码,原来自己真的错了。   
      下面我解释一下为什么是后一种结果   
      对一个类来说,static变量是与对象无关的,那么它们什么时候被初始化呢?就是在第一次引用的时候。当类生成对象的时候,可以简单分成3步   
      1,为所有static变量分配内存,这个时候内存里面的值是该变量类型的缺省值。关于不同值类型的缺省值大家可以去查相关资料,注意值类型和引用类型是不同的。   
      2,为static变量赋值,同样要注意值类型和引用类型是不同的。   
      3,生成对象,调用构造函数,先调用这个类的父类的构造函数,然后调用类本身的构造函数,生成对象。   
      现在分析上面的代码:   
      Console.WriteLine(string.Format("i={0}",i));这里i是static变量,而且类class1是第一次被引 用,按照上面说的三步,要先为class1里面所有的static变量分配内存。尽管现在有超线程技术,但是指令在逻辑还是一条一条的按顺序执行的,所以 先为static   int   i分配内存,并且在该内存中保持int的缺省值0,接着再为static   int   num   变量分配内存,值当然也为0。   
      然后执行第二步,为变量赋值:先为static   int   i变量赋值,i=getNum(),看getNum里面的代码,就是return   num,这个时候num的值是0,于是i就为0了。然后对变量num赋值,num=1;这行代码执行后,num就为1了。分析到这里我就不继续分析了,大 家很容易看出结果是什么。   
        
      稍微熟悉c#的人,只要认真看代码,肯定不会出错,但是如果拿来考人,相信很多人会做错。我认为这个问题简单得算不上一个技术问题,所以放在非技术区。之 所以在上面说那么多废话来分析,是想说明在编程的时候,即使非常熟悉、非常基本的东西,也要认真。当然如果我手下的人写出这样的代码,肯定在代码检视的时 候被我痛批。事实上对static   值类型变量不直接赋值,而通过方法来赋值,是不常用或者是有点bt的做法,但是我仍然很佩服出题的人。 

  • 相关阅读:
    pom变成红橙色
    拉链表
    Newsgroups数据集研究
    python 安装第三方包
    概率图(三)CRF条件随机场
    概率图(二)马尔科夫随机场MRF
    LDA主题模型
    TF-IDF算法
    mysql 自定义排序顺序
    [转]解决a different object with the same identifier value was already associated with the session错误
  • 原文地址:https://www.cnblogs.com/dianshi/p/4199753.html
Copyright © 2011-2022 走看看