C#类中static变量

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03



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的做法,但是我仍然很佩服出题的人。

参考页面:http://qingqingquege.cnblogs.com/p/5933752.html

时间: 2024-11-06 12:53:09

C#类中static变量的相关文章

C#类中static变量用法分析

本文实例讲述了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) { Co

c++ 类与函数中static变量初始化问题(转)

首先static变量只有一次初始化,不管在类中还是在函数中..有这样一个函数: 1 void Foo() 2 { 3 static int a=3; // initialize 4 std::cout << a; 5 a++; 6 } 里的static int a=3只执行了一次.在main中调用Foo()两次,结果为34.将上面的函数改为 1 void Foo() 2 { 3 static int a; 4 a=3; // not initialize 5 std::cout <<

关于在事件代码中如何访问类中的变量

事件代码访问类中变量的3种方法. 在写事件代码的时候,常常需要引用主类中的变量.要访问这些变量是需要一些技巧的. 方法一: 加上final修饰符. 1 public class HelloWorld5 { 2 public static void main(String[] args) { 3 // 在变量前加上final,否则在事件代码里不能引用. 4 final String str = "孔肖寒"; 5 6 Display display = Display.getDefault

C++类中静态变量和普通变量的区别

静态变量: 1.静态变量会被编到程序的exe里面,从程序启动到结束,它一直存在: 2.静态变量的初始化值为0: 3.全局变量默认是静态变量: 4.在类中的函数变量前面加了static的也是静态变量,只不过被语言限定在只能在函数内部使用: 5.在有MFC对话框的程序了,如果一个变量和对话框绑定,那么该变量就不能声明为静态变量,函数也是一样的,因为声明为静态变量后不能随时接受对话框内的值,    主要是因为静态变量的值设置后是不能被修改的: 6.可以使用类名+静态成员名访问此静态成员,因为静态成员存

在Java类中的变量

众所周知,在Java的类中有三种变量,那么这三种变量有什么区别呢? 1.局部变量:这是一种定义在方法内部中的变量.这就表示这种变量的作用域就是在该方法内部.其他方法中无法调用该变量. 2.成员变量:这是定义在类的内部但方法外的变量,在创建对象的时候可以实例化该对象.作用域是整个类内部.(包括所有方法) 3.类变量:这跟成员变量一样,是定义在类的内部方法体之外.但与之不同的是这是一种静态的变量,说白了就是必须要用static修饰.通常使用类名+变量名来使用,可以不用创建对象.大大提高了内存的使用效

继承类中static数据值

1 class A{ 2 static int num = 1; 3 public static void Display(){ 4 System.out.println( num ); 5 } 6 } 7 8 class B extends A{ 9 static int num = 2; 10 public static void Display(){ 11 System.out.println( num ); 12 } 13 } 14 15 class C extends A{ 16 st

ecmall中static变量的使用-model模型代码设计

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 function &m($model_name, $params = array(), $is_new = false) {     <span style="backg

php 类中的变量的定义

php 如果在类中定义变量,在类的方法中调用时应该加上$this-> . class ClassName { private $a = 333; function __construct() { $this->a = 2222; } public function bbb($value='') { echo $this->a; } } $b = new className(); echo $b->bbb();

【C++基础】 类中static private public protected

静态成员在一个类的所有实例间共享数据 “类属性”,是描述类的所有对象共同特征的一个数据项,对所有对象,它的值相同,static定义,为整个类所共有.相对于“实例属性” 如果static成员是私有类型,则只可通过共有静态成员函数访问 [注意]类中仅对成员进行声明而不初始化,必须在文件作用域的某个地方初始化 在class和main外即全局变量域,int Test::ite=0 ;   public private protected 派生类可访问的类型 可以 可以 可以         [C++基础