博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

静态变量和非静态变量

Posted on 2009-07-10 17:09  giscolor  阅读(647)  评论(1编辑  收藏  举报

静态变量和非静态变量
在c里面都是静态的.

在c#里对于类里面的任何非静态成员,要用就必须有对象应用。 
  class   A 
  { 
      static   int   a; 
               int   b; 
  } 
  main 
  {  
        int   i   =   0; 
        A   classA   =   new  A(); 
        //要用b就必须写成 
        classA.b   =   i; 
        //要用a就必须写成 
        A.a   =   i; 
        //看出来没有,classA是对象,而A是类; 
  }  
   
  

理论部分:
一.静态变量和非静态变量的基本概念
  
   数据成员包括:静态变量和非静态变量两种
 
   A 静态变量:带有static 修饰符的变量称为静态变量。
   B 非表态变量:不带有static修饰符声明的变量称为实例变量。

二. 两都的一些区别
     class test
     {
            static int b=0;        //静态变量
            int a=0;                 //非静态变量

     }
     1.内存分配的区别:静态变量定义时就会存在于内存当中,直到它所在的类的程序运行结束之时它都将一直存在;而非静态变量需要被实例化后才会分配内存,它的存在周期取决于实例化的类的生存周期。
       所以他们的调用方式也不相同:
       静态变量:可以(只能)通过类本身.静态变量名,类的实例是不能调用的。
       非静态变量: 当该变量所在的类被实例化后,可以通过实例化的类名来访问。
       (另外静态成员不能访问非静态成员;非静态成员可以访问静态成员)
             test.b=2; //OK
             test t=new test();
             t.a=0;      //OK
             t.b=3 ;      //Error 编绎时会出错 无法使用实例引用访问静态成员

     2. 两者值的共享问题: 静态变量被所有类的实例对象共享,即一个实例的改变了静态变量的值,其他同类的实例读到的就是变化后的值。非静态变量是不共享的。
        ex:下面的最后的输出结果是:10,0
        class Class1
       {
        public  static int cs1=0;
        public int cs3=0;
        }
        class Class2
       {
              public void a()
              {
                       Console.WriteLine(Class1.cs1.ToString());

// 因cs1是静态变量,所以当类Program修改cs1=10后,其它类的实例读到的值就是修改后的值10,所以此处输出的是:10
                       Class1 cc = new Class1();
                       Console.WriteLine(cc.cs3.ToString()); 

 //虽然类Program修改值cs3=34;但因cs3在class1类中是非静态变量,它的生存周期于实例化他的类的周期相同,所以当用类名ct实例结束后其值也不会存在于内存当中,当此类用另一个类名cc来实例化后调用变量cs3,其值仍是非静态变量初始化的值0.
               }
        }
        class Program
       {
         static void Main(string[] args)
        {
            Class1.cs1 = 10;
            Class1 ct = new Class1();
            ct.cs3 = 34;
            Class2 cm = new Class2();
            cm.a();  
         }
       }
      


 

类名.静态变量名

实例化的名.非静态变量名