中的static静态变量,中static静态变量的用法
分类:计算机编程

一、静态类

一对东西你任何时间任何地方在用,但不至于就表示你实在通晓它,正如小编此前所精晓的 static 。

logitechyan原文关于C#中static静态变量

选取 static 修饰符证明属于类型小编并不是属于特定目的的静态成员static修饰符可用于类、字段、方法、属性、运算符、事件和构造函数,但无法用来索引器、析构函数或类以外的品类

  静态类与非静态类的重要性分歧在于静态类不可能实例化,也正是说,无法接纳new 关键字创立静态类类型的变量。在声惠氏个类时使用static关键字,具有五个方面包车型地铁意义:首先,它幸免程序猿写代码来实例化该静态类;其次,它幸免在类的里边宣称任何实例字段或格局。

一、静态类

  C#静态变量使用static 修饰符举行宣示,在类被实例化时成立,通过类实行访谈不含有 static 修饰符注明的变量称做非静态变量,在目标被实例化时创建,通过对象开展访谈二个类的有所实例的同一C#静态变量都是同一个值,同一个类的两样实例的一律非 静态变量能够是例外的值。静态函数的兑现里不能够动用非静态成员,如非静态变量、非静态函数等。 使用 static 修饰符表明属于类型小编并不是属于特定对象的静态成员static修饰符可用于类、字段、方法、属性、运算符、事件和构造函数,但不可能用于索引器、析构函 数或类以外的连串

 

  1、静态类的关键特色:

  静态类与非静态类的基本点区别在于静态类不可能实例化,约等于说,不可能使用 new 关键字创设静态类类型的变量。在宣称二个类时使用static关键字,具备八个地方的含义:首先,它幸免程序猿写代码来实例化该静态类;其次,它幸免在类的个中宣称任何实例字段或措施。

  

静态全局变量

  [1] 仅包蕴静态成员。

  1、静态类的首要性特色:

静态全局变量

定义:在全局变量前,加上关键字 static 该变量就被定义成为了一个静态全局变量。

  [2] 不可能实例化。

  [1] 仅包蕴静态成员。

在全局变量前,加上关键字 static 该变量就被定义成为了多个静态全局变量。

特点:   A、该变量在全局数据区分配内部存款和储蓄器。   B、开端化:倘诺不显式先河化,那么将被隐式开头化为0。

  [3] 静态类的原形,是叁个虚幻的密闭类,所以无法被接续,也不可能被实例化。

  [2] 不恐怕实例化。

特点

 

  [4] 不能够蕴含实例构造函数。

  [3] 静态类的本色,是三个华而不实的密封类,所以不能够被接续,也不能够被实例化。

该变量在大局数据区分配内存

静态局地变量

  [5] 假如一个类下边包车型客车装有成员,都急需被分享,那么能够把那些类定义为静态类。

  [4] 不能够包涵实例构造函数。

开头化:假设不显式伊始化,那么将被隐式伊始化为0。

定义:在有个别变量前增进static关键字时,就定义了静态局部变量。

  2、静态类与私家构造函数差距:

  [5] 倘使贰个类上边包车型客车全体成员,都亟待被分享,那么能够把这么些类定义为静态类。

 

特点:   A、该变量在大局数据区分配内部存款和储蓄器。   B、开头化:若是不显式开头化,那么将被隐式带头化为0。   C、它始终驻留在全局数据区,直到程序运维甘休。但其成效域为部分成效域,当定义它的函数或 语句块甘休时,其作用域随之甘休。

  [1] 私有构造器方式如故能够从类的里边对类举办实例化,而静态类幸免从任何地方实例化类,在那之中包蕴从类自身内部。

  2、静态类与私家构造函数不一致:

静态局地变量

静态数据成员
特点:   A、内存分配:在程序的全局数据区分配。   B、早先化和概念:     a、静态数据成员定义时要分配空间,所以不能在类证明中定义。     b、为了制止在三个应用该类的源文件中,对其再度定义,所在,不可能在类的头文件中     定义。     c、静态数据成员因为程序一早先运维就必得存在,所以其初步化的特等地方在类的内部贯彻。   C、特点     a、对相于 public,protected,private 关键字的影响它和平凡数据成员一致,     b、因为其空间在大局数据区分配,属于持有本类的靶子共享,所以,它不属于特定的类对象,在没发生类对象时其成效域就看得出,即在未曾发出类的实例时,大家就足以操作它。
  D、访谈方式     a、 类对象名.静态数据成员名

  [2] 使用民用构造器的类中,是同意有实例成员的,编写翻译器不一致敬静态类有此外实例成员。

  [1] 私有构造器格局依旧能够从类的里边对类举行实例化,而静态类禁绝从任哪儿方实例化类,个中满含从类自己内部。

定义

        E、静态数据成员,主要用在类的富有实例都怀有的属性上。举个例子,对于二个储蓄类,帐号相对   于各种实例都以见仁见智的,但每一个实例的利息率是平等的。所以,应该把利息设为积蓄类的静态数据成员。这有七个低价,第一,不管定义多少个储蓄类对象,利息数据成员都分享分配在大局区的内部存款和储蓄器,所以节省存贮空间。第二,一旦利息要求改动时,只要更换叁次,则有着积贮类对象的利息率全改成过来了,因为它们其实是公家七个事物。  

  [3] 使用静态类的亮点在于,编写翻译器能够实施检查以担保不致不时地加上实例成员,编写翻译器将保障不会创设此 类的实例。

  [2] 使用个人构造器的类中,是同意有实例成员的,编写翻译器不容许静态类有别的实例成员。

在有个别变量前拉长static关键字时,就定义了静态局地变量。

静态成员函数
特点:   A、静态成员函数与类相挂钩,不与类的对象相互换。   B、静态成员函数无法访谈非静态数据成员。原因极粗略,非静态数据成员属于特定的类实例。
作用:   首要用以对静态数据成员的操作。

  [4] C#编写翻译器会自动把它标识为sealed。这么些根本字将类钦赐为不可增加;换言之,不能从它派生出其他类。

  [3] 使用静态类的长处在于,编写翻译器能够实行行检查查以保险不致不时地抬高实例成员,编写翻译器将保证不会成立此 类的实例。

特点:   

调用格局:   A、类对象名.静态成员函数名()

二、静态成员

  [4] C#编写翻译器会自动把它标记为sealed。那一个重大字将类内定为不可扩充;换言之,不能够从它派生出其余类。

该变量在全局数据区分配内部存款和储蓄器。   

 

  1、通过static关键字修饰,是属于类,实例成员属于对象,在这里个类第二次加载的时候,那几个类上边包车型地铁享有静态成员会被加载。

二、静态变量

最初化:要是不显式开头化,那么将被隐式先河化为0。

static静态变量的实例与深入分析

  2、静态成员只被创建三回,所以静态成员独有一份,实例成员有微微个指标,就有微微份。

  1、通过static关键字修饰,是属于类,实例成员属于对象,在这几个类第三回加载的时候,那么些类上面包车型客车具备静态成员会被加载。

它一贯驻留在全局数据区,直到程序运转结束。但其作用域为一些作用域,当定义它的函数或 语句块结束时,其成效域随之停止。

 实例

  3、类加载的时候,全部的静态成员就能够被创建在“静态存款和储蓄区”里面,一旦创造直到程序退出,才会被回收。

  2、静态成员只被创立一回,所以静态成员独有一份,实例成员有微微个指标,就某些许份。

 

 

  4、成员需求被分享的时候,方法须要被频仍调用的时候,就足以把那几个分子定义为静态成员。

  3、类加载的时候,全体的静态成员就能被创建在“静态存款和储蓄区”里面,一旦创设直到程序退出,才会被回收。

静态数据成员
特点:   

C# 代码   复制

  5、在静态方法中,不能够直接调用实例成员,因为静态方法被调用的时候,对象还大概有非常大也许子虚乌有。

  4、变量要求被分享的时候,方法须求被频仍调用的时候,就足以把那些分子定义为静态成员。

内部存款和储蓄器分配:

 using System;

  6、this/base 关键字在静态方法中不能够运用,因为有望对象还不设有。

  5、在静态方法中,无法一贯调用实例成员,因为静态方法被调用的时候,对象还会有极大可能率空头支票。

在前后相继的大局数据区分配。   

图片 1图片 2

  7、能够成立这些类的指标,拟定指标的积极分子在静态方法中操作。

  6、this/base 关键字在静态方法中不能够接纳,因为有十分大恐怕对象还不设有。

开头化和概念:    

namespace teststatic

  8、在实例方法中,能够调用静态成员,因为今年静态成员料定期存款在。

  7、能够创制那些类的目的,拟订指标的分子在静态方法中操作。

a、静态数据成员定义时要分配空间,所以不可能在类申明中定义。    

图片 3

  9、非静态类可以蕴含静态的法子、字段、属性或事件;

  8、在实例方法中,能够调用静态成员,因为今年静态成员料定期存款在。

b、为了幸免在三个利用该类的源文件中,对其再次定义,所在,不能够在类的头文件中定义。    

{
    class class1
    {
        static int i = getNum();
        int j = getNum();

        static int num = 1;

        static int getNum()
        {
            return num;
        }

        static void Main(string[] args)
        {
            Console.WriteLine("i={0}",i);
            Console.WriteLine("j={0}", new class1().j);
            Console.Read();
        }
    }
}

  10、无论对一个类创制多少个实例,它的静态成员都唯有多少个别本;

  9、非静态类能够饱含静态的艺术、字段、属性或事件;
  10、无论对贰个类成立多少个实例,它的静态成员都独有三个别本;
  11、静态方法和天性无法访问其包涵类型中的非静态字段和事件,并且无法访谈任何对象的实例变量;
  12、静态方法只可以被重载,而不可能被重写,因为静态方法不属于类的实例成员;
  13、即使字段无法宣称为 static const,但 const 字段的一坐一起在本质上是静态的。那样的字段属于类,不属于类的实例。

c、静态数据成员因为程序一初阶运营就必须存在,所以其伊始化的精品地方在类的个中贯彻。   

 

  11、静态方法和属性不可能访谈其包蕴类型中的非静态字段和事件,何况不能够访谈任何对象的实例成员;

三、静态方法

特点    

今昔解析上边的代码

  12、静态方法只好被重载,而无法被重写,因为静态方法不属于类的实例成员;

  1、静态方法是不属于特定目标的章程;

a、对相于 public,protected,private 关键字的影响它和平日数据成员平等,    

Console.WriteLine(string.Format("i={0}",i)); 这里i是static变量,并且类class1是第三次被引用,要先为class1里面全部的static变量分配内部存款和储蓄器。固然今天有超线程技能,可是指令在逻辑依然一条一条的按梯次实行的,所以 先为static int i分配内部存款和储蓄器,何况在该内部存款和储蓄器中保持int的缺省值0,接着再为static int num 变量分配内部存款和储蓄器,值当然也为0。

  13、纵然字段不可能声称为 static const,但 const 字段的作为在本质上是静态的。那样的字段属于类,不属于类的实例。

  2、静态方法能够访问静态成员变量;

b、因为其空间在全局数据区分配,属于全体本类的指标分享,所以,它不属于特定的类对象,在没产生类对象时其成效域就可以预知,即在向来不生出类的实例时,大家就能够操作它。

接下来实施第二步,为变量赋值:先为static int i变量赋值,i=getNum(),看getNum里面包车型地铁代码,就是return num,今年num的值是0,于是i就为0了。然后对变量num赋值,num=1;那行代码实践后,num就为1了。

三、静态方法

  3、静态方法不可能直接访问实例变量,能够在实例函数调用的场馆下,实例变量做为参数字传送给静态方法;

做客方式    

据此最终的结果为:

  1、静态方法是不属于特定目的的不二法门;

  4、静态方法也无法平昔调用实例方法,可以直接调用,首先要开创一个类的实例,然后通过这一一定指标来调用静态方法。

 类对象名.静态数据成员名

 i=0 j=1

  2、静态方法可以访问静态成员;

四、静态构造函数

 

  3、静态方法不可能平素访谈实例成员,能够在实例函数调用的状态下,实例成员做为参数字传送给静态方法;

  1、静态类可以有静态构造函数,静态构造函数不可再而三;
  2、静态构造函数能够用于静态类,也可用来非静态类;
  3、静态构造函数无访谈修饰符、无参数,独有三个 static 标记;
  4、静态构造函数不可被一向调用,当创设类实例或援引任王硕态成员以前,静态构造函数被活动实行,何况只进行三回。

静态数据成员,主要用在类的兼具实例都怀有的质量上。比如,对于三个积储类,帐号相对于每种实例都以见仁见智的,但每一个实例的利息是同一的。所以, 应该把利息设为积储类的静态数据成员。那有七个好处,第一,不管定义多少个积贮类对象,利息数据成员都分享分配在大局区的内部存款和储蓄器,所以节省存贮空间。第二, 一旦利息要求退换时,只要更动叁次,则兼具储蓄类对象的利息全改成过来了,因为它们其实是公私多少个东西。

  4、静态方法也不能够一贯调用实例方法,能够直接调用,首先要创制二个类的实例,然后经过这一一定指标来调用静态方法。

  例如: 

  

四、静态构造函数

class Program

 {

         public static int i =0;

         public Program()

         {

             i = 1;

             Console.Write("实例构造方法被调用");

         }

         static Program()

         {

             i = 2;

             Console.Write("静态构造函数被执行");

         }

         static void Main(string[] args)

         {

             Console.Write(Program.i);//结果为2,首先,类被加载,所有的静态成员被创建在静态存储区,i=0,接着调用了类的成员,这时候静态构造函数就会被调用,i=2

             Program p = new Program();

             Console.Write(Program.i);//结果为1,实力化后,调用了实例构造函数,i=1,因为静态构造函数只执行一次,所以不会再执行。

         }

 }

静态成员函数
特点:   

  1、静态类能够有静态构造函数,静态构造函数不可三番五次;
  2、静态构造函数能够用来静态类,也可用于非静态类;
  3、静态构造函数无访谈修饰符、无参数,唯有多个 static 标记;
  4、静态构造函数不可被直接调用,当创制类实例或援用任何钦态成员从前,静态构造函数被自动实施,并且只举办三回。

五、静态变量的蕴藏

静态成员函数与类相挂钩,不与类的对象相挂钩。   

  例如:

  使用 static 修饰符申明属于类型笔者并非属于特定目的的静态成员static修饰符可用于类、字段、方法、属性、运算符、事件和构造函数,但无法用来索引器、析构函数或类以外的品类。

静态成员函数不可能访谈非静态数据成员。原因很简单,非静态数据成员属于特定的类实例。
作用:   

图片 4

静态全局变量

要害用以对静态数据成员的操作。

class Program
 {
         public static int i =0;
         public Program()
         {
             i = 1;
             Console.Write("实例构造方法被调用");
         }
         static Program()
         {
             i = 2;
             Console.Write("静态构造函数被执行");
         }
         static void Main(string[] args)
         {
             Console.Write(Program.i);//结果为2,首先,类被加载,所有的静态成员被创建在静态存储区,i=0,接着调用了类的成员,这时候静态构造函数就会被调用,i=2
             Program p = new Program();
             Console.Write(Program.i);//结果为1,实力化后,调用了实例构造函数,i=1,因为静态构造函数只执行一次,所以不会再执行。
         }
 }

定义:在全局变量前,加上关键字 static 该变量就被定义成为了五个静态全局变量。

调用情势:  

图片 5

特点

类对象名.静态成员函数名()

 

A、该变量在大局数据区分配内部存款和储蓄器。   

  

五、静态成员的仓库储存

  使用 static 修饰符注脚属于类型笔者并不是属于特定对象的静态成员static修饰符可用于类、字段、方法、属性、运算符、事件和构造函数,但不可能用于索引器、析构函数或类以外的门类。

  静态全局变量

  定义:在全局变量前,加上关键字 static 该变量就被定义成为了二个静态全局变量。

  特点:A、该变量在全局数据区分配内部存款和储蓄器。   B、早先化:即使不显式起始化,那么将被隐式开端化为0。

 

  静态局地变量

  定义:在局部变量前拉长static关键字时,就定义了静态局地变量。

  特点:A、该变量在大局数据区分配内部存款和储蓄器。   B、起始化:假使不显式早先化,那么将被隐式起先化为0。   C、它始终驻留在全局数据区,直到程序运营结束。但其作用域为部分功效域,当定义它的函数或 语句块截至时,其成效域随之结束。

 

  静态数据成员
  特点

  A、内部存款和储蓄器分配:在前后相继的大局数据区分配。   

  B、初叶化和定义:     a、静态数据成员定义时要分配空间,所以不能够在类注明中定义。     b、为了幸免在几个使用该类的源文件中,对其再一次定义,所在,无法在类的头文件中定义。     c、静态数据成员因为程序一齐先运转就必得存在,所以其开始化的特等地点在类的中间贯彻。   

  C、特点     a、对相于 public,protected,private 关键字的影响它和平时数据成员平等,     b、因为其空间在全局数据区分配,属于持有本类的靶子分享,所以,它不属于特定的类对象,在没产生类对象时其成效域就看得出,即在尚未爆发类的实例时,大家就能够操作它。
  D、访谈情势     a、 类对象名.静态数据成员名

        E、静态数据成员,主要用在类的全体实例都持有的习性上。譬如,对于二个储蓄类,帐号相对于各类实例都以见仁见智的,但每一个实例的利息率是一致的。所以,应该把利息设为积蓄类的静态数据成员。那有八个低价,第一,不管定义多少个储蓄类对象,利息数据成员都分享分配在全局区的内部存款和储蓄器,所以节省存贮空间。第二,一旦利息必要退换时,只要改变一回,则持有积贮类对象的利息率全改成过来了,因为它们其实是公共二个事物。  

  静态成员函数
  特点:   A、静态成员函数与类相关联,不与类的对象相关联。   B、静态成员函数无法访问非静态数据成员。原因非常粗略,非静态数据成员属于特定的类实例。
  作用:   首要用于对静态数据成员的操作。

  调用格局:   A、类对象名.静态成员函数名()

 

  static静态变量的实例与剖判,代码如下

图片 6

class Program
    {
        static int i = getNum();
        int j = getNum();

        static int num = 1;

        static int getNum()
        {
            return num;
        }

        static void Main(string[] args)
        {
            Console.WriteLine("i={0}", i);
            Console.WriteLine("j={0}", new Program().j);
            Console.Read();
        }

    }

图片 7

 

  分析上边的代码

  Console.WriteLine("i={0}", i);

  这里 i 是 static 变量,在类 Program  第二遍被加载时,要先为 Program  个中有着的 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了。所以,j=1。

  所以最后的结果为:

   i=0 j=1

  注意:

  当类第贰遍被加载时,会对类中的静态变量先按梯次实行分红内存空间,当全部分红完内存空间之后,在对静态变量按梯次赋值。

 

  首先分为两有个别 贮存器和内部存储器(满含缓存)

  内部存款和储蓄器分为两片段 代码和数据

  数据分为两有的 静态存储区和平运动作时存款和储蓄

  运营时存款和储蓄分为 货仓 和 堆
  静态存款和储蓄分为 全局静态存款和储蓄 和 常量

B、开始化:假使不显式起头化,那么将被隐式开首化为0。

static静态变量的实例与解析

 

 实例

静态局地变量

using System;

namespace teststatic

{
    class class1
    {
        static int i = getNum();
        int j = getNum();

        static int num = 1;

        static int getNum()
        {
            return num;
        }

        static void Main(string[] args)
        {
            Console.WriteLine("i={0}",i);
            Console.WriteLine("j={0}", new class1().j);
            Console.Read();
        }
    }
}

定义:在一部分变量前拉长static关键字时,就定义了静态局地变量。

 

特点:   

现行反革命深入分析上面的代码

A、该变量在全局数据区分配内部存款和储蓄器。   

Console.WriteLine(string.Format("i={0}",i)); 这里i是static变量,况兼类class1是第贰次被引用,要先为class1里面全体的static变量分配内部存款和储蓄器。固然现行反革命有超线程才干,但是指令在逻辑依然一条一条的按顺序实践的,所以 先为static int i分配内部存款和储蓄器,何况在该内部存款和储蓄器中保持int的缺省值0,接着再为static int num 变量分配内部存款和储蓄器,值当然也为0。

B、起先化:要是不显式伊始化,那么将被隐式起始化为0。   

接下来实行第二步,为变量赋值:先为static int i变量赋值,i=getNum(),看getNum里面包车型客车代码,正是return num,那年num的值是0,于是i就为0了。然后对变量num赋值,num=1;那行代码试行后,num就为1了。

C、它始终驻留在全局数据区,直到程序运行截至。但其功能域为局地功能域,当定义它的函数或 语句块甘休时,其功用域随之截止。

故此最后的结果为:

静态数据成员
特点:   

 i=0 j=1

A、内部存款和储蓄器分配:在程序的大局数据区分配。   

 

B、开端化和概念:    

a、静态数据成员定义时要分配空间,所以不可能在类注脚中定义。    

b、为了制止在七个利用该类的源文件中,对其重新定义,所在,不能够在类的头文件中定义。    

c、静态数据成员因为程序一初步运行就必须存在,所以其伊始化的超级地方在类的里边贯彻。   

C、特点    

a、对相于 public,protected,private 关键字的影响它和经常数据成员一致,    

b、因为其空间在大局数据区分配,属于持有本类的目的分享,所以,它不属于特定的类对象,在没发出类对象时其功能域就可以知道,即在未有发出类的实例时,大家就足以操作它。
D、访谈格局    

a、 类对象名.静态数据成员名

E、静态数据成员,首要用在类的有所实例都抱有的质量上。比如,对于贰个积储类,帐号相对   于每种实例都以见仁见智的,但各类实例的利息是一模二样的。所以,应该把利息设为积储类的静态数据成员。那有七个好处,第一,不管定义多少个积贮类对象,利息数据成员都分享分配在全局区的内部存款和储蓄器,所以节省存贮空间。第二,一旦利息供给改换时,只要改换一遍,则具备积贮类对象的利息全改成过来了,因为它们其实是共用三个事物。  

静态成员函数
特点:   

A、静态成员函数与类相关联,不与类的靶子相挂钩。   

B、静态成员函数不能够访谈非静态数据成员。原因很轻易,非静态数据成员属于特定的类实例。
作用:   主要用于对静态数据成员的操作。

调用格局:   

A、类对象名.静态成员函数名()

 

static静态变量的实例与分析

 实例: 

using System;

namespace teststatic

{

    class class1

    {

        static int i = getNum();

        int j = getNum();



        static int num = 1;



        static int getNum()

        {

            return num;

        }



        static void Main(string[] args)

        {

            Console.WriteLine("i={0}",i);

            Console.WriteLine("j={0}", new class1().j);

            Console.Read();

        }

    }

}

未来分析下边的代码

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了。

就此最终的结果为:

 i=0 j=1

 

  首先分为两部分 存放器和内部存款和储蓄器(满含缓存)

  内部存款和储蓄器分为两有的 代码和多少

  数据分为两有个别 静态存款和储蓄区和周转时存款和储蓄

  运营时存款和储蓄分为 仓库 和 堆
  静态存储分为 全局静态存款和储蓄 和 常量

 

本文由pc28.am发布于计算机编程,转载请注明出处:中的static静态变量,中static静态变量的用法

上一篇:非泛型群集和泛型集结的精品详解,源码阅读总 下一篇:没有了
猜你喜欢
热门排行
精彩图文