zoukankan      html  css  js  c++  java
  • 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();

    }

    }

  • 相关阅读:
    MySql 用户 及权限操作
    MAC 重置MySQL root 密码
    在mac系统安装Apache Tomcat的详细步骤[转]
    Maven:mirror和repository 区别
    ES6 入门系列
    转场动画CALayer (Transition)
    OC 异常处理
    Foundation 框架
    Enum枚举
    Invalid App Store Icon. The App Store Icon in the asset catalog in 'xxx.app' can’t be transparent nor contain an alpha channel.
  • 原文地址:https://www.cnblogs.com/muxueyuan/p/11094745.html
Copyright © 2011-2022 走看看