中的static静态变量,static的用法详解

一、静态类

有个别东西你随时在用,但不见得就代表你真正明白它,正如小编前边所领会的 static

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

应用 static
修饰符证明属于类型笔者而不是属于特定指标的静态成员static修饰符可用于类、字段、方法、属性、运算符、事件和构造函数,但不可能用来索引器、析构函数或类以外的门类

  静态类与非静态类的主要性差别在于静态类不能够实例化,也便是说,无法采纳new
关键字创设静态类类型的变量。在声多美滋个类时使用static关键字,具有多个方面包车型大巴含义:首先,它制止程序员写代码来实例化该静态类;其次,它制止在类的在那之中宣称任何实例字段或措施。

一、静态类

  C#静态变量使用static
修饰符进行宣示,在类被实例化时创设,通过类实行走访不包涵 static
修饰符申明的变量称做非静态变量,在目的被实例化时创设,通过对象进行访问3个类的装有实例的同一C#静态变量都是同三个值,同三个类的分裂实例的同等非
静态变量能够是见仁见智的值。静态函数的实现里无法利用非静态成员,如非静态变量、非静态函数等。
使用 static
修饰符注脚属于类型我而不是属于特定对象的静态成员static修饰符可用于类、字段、方法、属性、运算符、事件和构造函数,但不能够用来索引器、析构函
数或类以外的项目

 

  一 、静态类的主要性特色:

  静态类与非静态类的主要差距在于静态类无法实例化,相当于说,不可能选拔new
关键字创立静态类类型的变量。在宣称3个类时使用static关键字,具有四个地点的意思:首先,它幸免程序员写代码来实例化该静态类;其次,它幸免在类的内部宣称任何实例字段或方法。

  

静态全局变量

  [1] 仅包罗静态成员。

  ① 、静态类的主要性特点:

静态全局变量

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

  [2] 不能够实例化。

  [1] 仅包涵静态成员。

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

特点:   A、该变量在大局数据区分配内部存款和储蓄器。
  B、开首化:假设不显式开首化,那么将被隐式初阶化为0。

  [3]
静态类的真面目,是二个华而不实的密封类,所以不能被接续,也无法被实例化。

  [中的static静态变量,static的用法详解。2] 不或然实例化。

特点

 

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

  [3]
静态类的真相,是二个华而不实的密封类,所以无法被一而再,也不可能被实例化。

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

静态局地变量

  [5]
倘诺一个类下边的有所成员,都亟需被共享,那么能够把那些类定义为静态类。

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

早先化:假若不显式先导化,那么将被隐式开端化为0。

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

  二 、静态类与个体构造函数分歧:

  [5]
假设贰个类上边包车型地铁拥有成员,都须求被共享,那么能够把那一个类定义为静态类。

 

特点:   A、该变量在全局数据区分配内部存款和储蓄器。
  B、最先化:尽管不显式起先化,那么将被隐式开首化为0。
  C、它一贯驻留在全局数据区,直到程序运营停止。但其功用域为部分成效域,当定义它的函数或 语句块甘休时,其成效域随之截止。

  [1]
私有构造器方式还能从类的内部对类举行实例化,而静态类禁止从其余地方实例化类,个中包括从类本人内部。

  ② 、静态类与私家构造函数分歧:

静态局地变量

静态数据成员
特点:   A、内部存储器分配:在先后的大局数据区分配。
  B、初步化和定义:    
a、静态数据成员定义时要分配空间,所以不可能在类申明中定义。    
b、为了幸免在多个利用该类的源文件中,对其重新定义,所在,无法在类的头文件中
    定义。    
c、静态数据成员因为程序一开端运转就必需存在,所以其开首化的特级地方在类的内部贯彻。
  C、特点     a、对相于 public,protected,private
关键字的震慑它和一般数据成员平等,    
b、因为其空间在全局数据区分配,属于持有本类的目的共享,所以,它不属于特定的类对象,在没发出类对象时其功能域就看得出,即在并未发生类的实例时,大家就可以操作它。
  D、访问方式     a、 类对象名.静态数据成员名

  [2]
使用民用构造器的类中,是同意有实例成员的,编写翻译器分化意静态类有其余实例成员。

  [1]
私有构造器格局还是能够从类的当中对类举行实例化,而静态类禁止从其余地点实例化类,当中包涵从类自个儿内部。

定义

       
E、静态数据成员,主要用在类的装有实例都存有的属性上。比如,对于1个存款类,帐号绝对   于种种实例都以例外的,但各类实例的利息是相同的。所以,应该把利息设为存款类的静态数据成员。那有多个好处,第壹,不管定义多少个存款类对象,利息数据成员都共享分配在大局区的内部存款和储蓄器,所以节省存贮空间。第2,一旦利息需求转移时,只要改变二回,则装有存款类对象的利息全改成过来了,因为它们其实是集体二个东西。
 

  [3]
使用静态类的亮点在于,编写翻译器能够履行检查以担保不致偶然地加上实例成员,编写翻译器将有限帮助不会成立此
类的实例。

  [2]
使用民用构造器的类中,是同意有实例成员的,编写翻译器分化意静态类有其余实例成员。

在部分变量前增加static关键字时,就定义了静态局地变量。

静态成员函数
特点:   A、静态成员函数与类相挂钩,不与类的目的相沟通。
  B、静态成员函数不可能访问非静态数据成员。原因很简单,非静态数据成员属于特定的类实例。
作用:   首要用来对静态数据成员的操作。

  [4]
C#编写翻译器会活动把它标志为sealed。这么些主要字将类内定为不可增添;换言之,不能够从它派生出其余类。

  [3]
使用静态类的长处在于,编写翻译器能够实践检查以保险不致偶然地增进实例成员,编写翻译器将保证不会创制此
类的实例。

特点:   

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

贰 、静态成员

  [4]
C#编写翻译器会活动把它标志为sealed。那个重中之重字将类钦点为不可扩充;换言之,无法从它派生出其余类。

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

 

  ① 、通过static关键字修饰,是属于类,实例成员属于对象,在那几个类第3遍加载的时候,那几个类上边包车型大巴有着静态成员会被加载。

贰 、静态变量

初叶化:假如不显式开端化,那么将被隐式早先化为0。

static静态变量的实例与分析

  二 、静态成员只被创立叁遍,所以静态成员只有一份,实例成员有稍许个对象,就有稍许份。

  壹 、通过static关键字修饰,是属于类,实例成员属于对象,在这一个类第四回加载的时候,那个类上面包车型地铁持有静态成员会被加载。

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

 实例

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

  贰 、静态成员只被创制3次,所以静态成员唯有一份,实例成员有微微个对象,就有个别许份。

 

 

  肆 、成员要求被共享的时候,方法要求被一再调用的时候,就足以把那几个分子定义为静态成员。

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

静态数据成员
特点:   

C# 代码   复制

  ⑤ 、在静态方法中,不能够间接调用实例成员,因为静态方法被调用的时候,对象还有可能不设有。

  ④ 、变量需求被共享的时候,方法须求被一再调用的时候,就足以把这一个分子定义为静态成员。

内部存款和储蓄器分配:

 using System;

  六 、this/base 关键字在静态方法中不能够使用,因为有大概对象还不设有。

  五 、在静态方法中,不可能平素调用实例成员,因为静态方法被调用的时候,对象还有只怕不存在。

在先后的大局数据区分配。   

澳门葡京备用网址 1澳门葡京备用网址 2

  七 、能够制造这些类的指标,制定指标的分子在静态方法中操作。

  6、this/base 关键字在静态方法中不能够选取,因为有恐怕对象还不存在。

开首化和定义:    

namespace teststatic

  八 、在实例方法中,能够调用静态成员,因为这些时候静态成员肯定期存款在。

  ⑦ 、能够创立那个类的对象,制定目的的分子在静态方法中操作。

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

澳门葡京备用网址 3

  九 、非静态类能够涵盖静态的不二法门、字段、属性或事件;

  ⑧ 、在实例方法中,能够调用静态成员,因为那么些时候静态成员肯定期存款在。

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();
        }
    }
}

  十 、无论对二个类创立多少个实例,它的静态成员都惟有二个副本;

  九 、非静态类能够分包静态的点子、字段、属性或事件;
  拾、无论对几个类创设多少个实例,它的静态成员都唯有三个副本;
  1壹 、静态方法和质量或无法访问其富含类型中的非静态字段和事件,并且不能够访问任何对象的实例变量;
  1二 、静态方法只可以被重载,而无法被重写,因为静态方法不属于类的实例成员;
  1叁 、固然字段无法宣称为 static const,但 const
字段的一言一行在本质上是静态的。那样的字段属于类,不属于类的实例。

c、静态数据成员因为程序一起先运转就必需存在,所以其早先化的最佳地方在类的里边贯彻。
  

 

  1一 、静态方法和性质无法访问其蕴藉类型中的非静态字段和事件,并且无法访问任何对象的实例成员;

③ 、静态方法

特点    

前几天分析上面的代码

  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。

  1叁 、即便字段无法宣称为 static const,但 const
字段的行为在精神上是静态的。那样的字段属于类,不属于类的实例。

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

b、因为其空间在全局数据区分配,属于持有本类的对象共享,所以,它不属于特定的类对象,在没发出类对象时其作用域就看得出,即在未曾发生类的实例时,大家就足以操作它。

然后实施第2步,为变量赋值:先为static int
i变量赋值,i=getNum(),看getNum里面包车型大巴代码,正是return
num,这一个时候num的值是0,于是i就为0了。然后对变量num赋值,num=1;那行代码执行后,num就为1了。

三 、静态方法

  叁 、静态方法不可以直接待上访问实例变量,能够在实例函数调用的气象下,实例变量做为参数字传送给静态方法;

走访格局    

故此最终的结果为:

  ① 、静态方法是不属于特定对象的章程;

  ④ 、静态方法也不能够一向调用实例方法,能够直接调用,首先要创制八个类的实例,然后经过这一特定对象来调用静态方法。

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

 i=0 j=1

  ② 、静态方法能够访问静态成员;

④ 、静态构造函数

 

  叁 、静态方法不得以平素访问实例成员,能够在实例函数调用的状态下,实例成员做为参数传给静态方法;

  一 、静态类可以有静态构造函数,静态构造函数不可接二连三;
  二 、静态构造函数能够用于静态类,也可用于非静态类;
  三 、静态构造函数无访问修饰符、无参数,唯有贰个 static 标志;
  四 、静态构造函数不可被一贯调用,当创制类实例或引用任宗华态成员以前,静态构造函数被自动执行,并且只进行3次。

静态数据成员,首要用在类的享有实例都怀有的属性上。比如,对于多少个存款类,帐号相对于各样实例都以差异的,但每一种实例的利利息率是平等的。所以,
应该把利息设为存款类的静态数据成员。这有两个便宜,第2,不管定义多少个存款类对象,利息数据成员都共享分配在全局区的内部存款和储蓄器,所以节省存贮空间。第①,
一旦利息要求改变时,只要改变三次,则有着存款类对象的利息率全改成过来了,因为它们其实是公家二个事物。

  四 、静态方法也无法直接调用实例方法,能够间接调用,首先要开创3个类的实例,然后经过这一特定对象来调用静态方法。

  例如: 

  

肆 、静态构造函数

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,因为静态构造函数只执行一次,所以不会再执行。

         }

 }

静态成员函数
特点:   

  ① 、静态类能够有静态构造函数,静态构造函数不可持续;
  贰 、静态构造函数能够用来静态类,也可用以非静态类;
  三 、静态构造函数无访问修饰符、无参数,只有3个 static 标志;
  ④ 、静态构造函数不可被直接调用,当创制类实例或引用任杨东态成员此前,静态构造函数被活动执行,并且只进行二次。

伍 、静态变量的仓库储存

静态成员函数与类相关联,不与类的目的相挂钩。   

  例如:

  使用 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、静态数据成员,首要用在类的富有实例都抱有的质量上。比如,对于1个存款类,帐号相对于各种实例都以见仁见智的,但各类实例的利息率是一模一样的。所以,应该把利息设为存款类的静态数据成员。那有八个便宜,第②,不管定义多少个存款类对象,利息数据成员都共享分配在大局区的内部存款和储蓄器,所以节省存贮空间。第一,一旦利息须要变更时,只要改变一回,则持有存款类对象的利息全改成过来了,因为它们其实是公私2个事物。
 

  静态成员函数
  特点:   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、静态数据成员,重要用在类的具有实例都负有的质量上。比如,对于二个存款类,帐号相对   于每一种实例都以差异的,但种种实例的利息率是平等的。所以,应该把利息设为存款类的静态数据成员。那有四个便宜,第②,不管定义多少个存款类对象,利息数据成员都共享分配在大局区的内部存款和储蓄器,所以节省存贮空间。第叁,一旦利息必要变更时,只要改变3遍,则装有存款类对象的利息全改成过来了,因为它们其实是公家一个事物。
 

静态成员函数
特点:   

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

 

  首先分为两部分 寄存器和内部存款和储蓄器(包涵缓存)

  内部存款和储蓄器分为两局地 代码和多少

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

  运行时存款和储蓄分为 堆栈 和 堆
  静态存款和储蓄分为 全局静态存款和储蓄 和 常量

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website