• C#静态变量 总结


    在C#程序中,没有全局变量的概念,这意味着所有的成员变量只有该类的实例才能操作这些数据,这起到了“信息隐藏”的作用。但有些时候,这样做却不是个明智的选择。

    假设我们要定义一个图书类,要求该类能保存图书的数量,即每增加一本图书(定义一个实例),图书的数量应该加1。如果没有静态变量,我们需要将图书的数量保存在每本图书(实例)里,然而,这样的变量要在不同图书(实例)里重复存储,图书(实例)数量少的话,我们还能接受,如果图书(实例)数量较多的话,比如成千上万,我们无法想象这要造成多少资源(如内存、磁盘空间)的浪费,更让人无法忍受的是:因为图书(实例)的数量要保存在每本图书(实例)里,该值肯定是不同的。要使这些图书(实例)中保存的图书(实例)数量一致,我们必须在每增加一本新书(生成一个新实例)时,修改其他所有图书(实例)中保存的该值。Oh,My God!你会重新向往面向过程的程序设计方法,向往拥有全局变量的时代。但,这种局面不会出现,因为C#中为你准备好了另外一种变量类型:静态变量。它在类中类似全局变量,保存类的公共信息,所有该类的实例(对象)共享该值。

    声明静态变量的语法如下:

    <访问修饰符>static 数据类型 变量名;

    这里的访问修饰符跟类的其它成员一样,可以是public,protected,private或internal等。

    在普通的成员变量前加static关键字,就变成了静态变量。静态变量和实例变量存储方式不同,静态变量在声明开始,就一直存储在内存中,直到整个程序终止。而实例成员在创建对象时分配内存,并存储一个数据副本。所以静态成员变量认为是属于类的,而不是对象。

    静态变量与实例变量的区别如下: 
    1.内存分配 
    静态变量在应用程序初始化时,就存在于内存当中,直到它所在的类的程序运行结束时才消亡; 
    而实例变量需要被实例化后才会分配内存。 
    2.生存周期 
    静态变量生存周期为应用程序的存在周期; 
    实例变量的存在周期取决于实例化的类的存在周期。 
    3.调用方式 
    静态变量只能通过“类.静态变量名”调用,类的实例不能调用; 
    实例变量当该变量所在的类被实例化后,可通过实例化的类名直接访问。 
    4.共享方式 
    静态变量是全局变量,被所有类的实例对象共享,即一个实例的改变了静态变量的值,其他同类的实例读到的就是变化后的值; 
    实例变量是局部变量,不共享的。 
    5.访问方式 
    静态成员不能访问实例成员; 
    实例成员可以访问静态成员。

    静态变量在类装载的时候分配内存,以后创建的对象都使用的该内存,相应的操作也就是对这块内存进行操作。也可以看作是另类的全局变量。

    所以:静态变量只的值只会初始化一次,后面每次访问,都是上次处理过的值,(即使是在一个函数内部)。 实例变量每次都初始化。

    using System;
    class Program
    {
    static void Main(string[]args)
    {
    //输出未经定义的静态变量,结果为0;也说明了,在C#中未赋初值的变量系统自动赋为0
    Console.WriteLine(sort.i);
    //静态变量的访问方法(类名.静态变量名),而且还可以在外部操作静态变量呢,可见静态变量并不神秘;
    sort.i = 5;
    //输出5
    Console.WriteLine(sort.i);
    //还可以通过构造函数对静态变量赋初值呢,呵呵
    sort sortTest = new sort();
    //输出构造函数中的赋值 3;
    Console.WriteLine(sort.i);
    }
    }

    class sort
    {
    public static int i;
    public sort()
    {
    i = 3;
    }
    }

    静态变量必须使用类名来引用,而不能使用类的实例,因为,静态变量不属于任何实例,而是共有的。我们可以打个比方:在一个班级中,有些物品是个人的,我们想使用时,必须指出物品的所有者,比如说“王三的自行车”,在C#程序中我们可以使用:王三.自行车的格式。有些物品是大家共有的物品,不能以个人名义使用,而是用班级的名义使用,比如班集体出资买的篮球,只能说:“班级的篮球”,而不能说:“王三的篮球”。这绝对是不行的,这对其他人绝对是不公平的,我们可以联想到许多贪官污吏就是使用了不属于自己的东西,或以个人名义使用公家的东西而葬送了自己。

    说一句有用的就是:静态变量是用类名来引用它。即:类名.静态变量名;

    举个具体的例子如下:

    using System;
    using System.Collections.Generic;
    using System.Text;

    class Program

    {

    class Class1
    {

    public static String staticStr = "Class";
    public String notstaticStr = "Obj";

    }

    static void Main(string[]args)

    {

    //静态变量通过类进行访问,该类所有实例的同一静态变量都是同一个值

    Console.WriteLine("Class1's staticStr: {0}", Class1.staticStr);

    Class1 tmpObj1 = new Class1();

    tmpObj1.notstaticStr = "tmpObj1";

    Class1 tmpObj2 = new Class1();

    tmpObj2.notstaticStr = "tmpObj2";

    //非静态变量通过对象进行访问,不同对象的同一非静态变量可以有不同的值

    Console.WriteLine("tmpObj1's notstaticStr: {0}", tmpObj1.notstaticStr);

    Console.WriteLine("tmpObj2's notstaticStr: {0}", tmpObj2.notstaticStr);

    Console.ReadLine();

    }

    }

  • 相关阅读:
    Android百度地图
    Android开发性能优化大总结
    解析Android开发优化之:从代码角度进行优化的技巧
    073 HBASE的读写以及client API
    072 HBase的架构以及各个模块的功能
    071 HBase的安装部署以及简单使用
    070 关于HBase的概述
    069 Hue协作框架
    068 Oozie任务调度框架
    集合的知识点梳理(List,Set,不包含泛型)
  • 原文地址:https://www.cnblogs.com/muxueyuan/p/11094745.html
Copyright © 2020-2023  润新知