zoukankan      html  css  js  c++  java
  • C#中静态变量和 静态方法的作用

    一、静态变量

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

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

    静态变量的声明方式如下:

    [访问修饰符] static 数据类型 变量名;

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

    静态变量又如何使用呢?

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

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

    举个具体的例子如下:

    using System;
    
    class StaticVar
    {
        public int x;
        public static int y;
        public void PrintInfo(){
            Console.WriteLine("非静态变量x={0}",x);
            Console.WriteLine("静态变量y = {0}",y);
        }
    }
    class Test
    {
        static void Main(string[] args){
            StaticVar stv = new StaticVar();
            stv.x = 10;
            // stv.y = 20; //error;无法使用实例引用访问静态成员“StaticVar.y”;改用类型名来限定它
            StaticVar.y = 20;
            stv.PrintInfo();
        }
    }

    程序中被注释的部分:stv.y = 20是使用实例引用静态变量,这将引发错误。

    另外,我想说一句,对于静态变量在声明时,如果没有给出初始值或使用前没有赋任何值的话,系统会给他们一个默认值:对于整型数据默认值为0;单精度数据为:0.0f;双精度数据为0.0;布尔型数据为False;引用型数据为null。

    二、静态方法

    静态方法与静态变量一样,不属于任何特定的实例,属于类全体成员共有,由类名来调用。但要注意以下几点:

    静态方法只能访问类的静态成员,不能访问类的非静态成员

    非静态方法可以访问类的静态成员,也可以访问类的非静态成员;

    静态方法不能使用实例来调用,只能使用类名来调用。这里用一个具体的例子来说明:

    using System; 
    
    namespace TestStatic
    {
        class StaticTest
        {
            int x;
            static int y;
            public StaticTest(int a,int b){
                x = a;
                y = b;
            }
            public void SimplePrint(){
                Console.WriteLine("x="+x+",y="+y);
            }
            public static void StaticPrint(){
                Console.WriteLine("y={0}",y);
                // Console.WriteLine("x={0}",x); //静态方法中不能使用非静态成员
            }
        }
        class Test
        {
            static void Main(string[] args){
                StaticTest st = new StaticTest(10,23);
                st.SimplePrint();
                //st.StaticPrint(); //静态方法不能使用实例来调用
                StaticTest.StaticPrint();
            }
        }

    转载自:https://www.cnblogs.com/liuguangfa/p/5144023.html

  • 相关阅读:
    Codeforces Round #486 (Div. 3) F. Rain and Umbrellas
    Codeforces Round #486 (Div. 3) E. Divisibility by 25
    Codeforces Round #486 (Div. 3) D. Points and Powers of Two
    Codeforces Round #486 (Div. 3) C. Equal Sums
    Codeforces Round #486 (Div. 3) B. Substrings Sort
    Codeforces Round #486 (Div. 3) A. Diverse Team
    2018-06-08
    CCPC-2017-秦皇岛站
    洛谷 P4819 [中山市选]杀人游戏
    洛谷 P2721 小Q的赚钱计划
  • 原文地址:https://www.cnblogs.com/zhurong/p/9405779.html
Copyright © 2011-2022 走看看