一、静态类
1部分东西你随时在用,但不一定就象征你真正精通它,正如小编前面所了然的 static
。
logitechyan原文关于C#中static静态变量
利用 static
修饰符评释属于类型小编而不是属于特定目的的静态成员static修饰符可用于类、字段、方法、属性、运算符、事件和构造函数,但不能够用来索引器、析构函数或类以外的档次
静态类与非静态类的第三不一致在于静态类不可能实例化,也正是说,不可能运用
new
关键字创设静态类类型的变量。在宣称2个类时使用static关键字,具有八个地点的含义:首先,它幸免程序员写代码来实例化该静态类;其次,它制止在类的当中宣称任何实例字段或措施。
一、静态类
C#静态变量使用static
修饰符进行宣示,在类被实例化时成立,通过类进行访问不包罗 static
修饰符评释的变量称做非静态变量,在指标被实例化时创制,通过对象开始展览访问三个类的装有实例的同1C#静态变量都以同1个值,同八个类的不等实例的一致非
静态变量能够是差别的值。静态函数的落实里不可能动用非静态成员,如非静态变量、非静态函数等。
使用 static
修饰符注明属于类型作者而不是属于特定指标的静态成员static修饰符可用于类、字段、方法、属性、运算符、事件和构造函数,但无法用来索引器、析构函
数或类以外的品种
一、静态类的显要特征:
静态类与非静态类的重大差别在于静态类无法实例化,也正是说,不能够动用
new
关键字创造静态类类型的变量。在宣称二个类时使用static关键字,具有五个地点的含义:首先,它幸免程序员写代码来实例化该静态类;其次,它幸免在类的中间宣称任何实例字段或艺术。
静态全局变量
[1] 仅包罗静态成员。
壹、静态类的显要特色:
静态全局变量
定义:在全局变量前,加上关键字 static
该变量就被定义成为了贰个静态全局变量。
[2] 不可能实例化。
[1] 仅包涵静态成员。
在全局变量前,加上关键字 static 该变量就被定义成为了三个静态全局变量。
特点: A、该变量在大局数据区分配内部存款和储蓄器。
B、开端化:假如不显式开头化,那么将被隐式起先化为0。
[3]
静态类的青城山真面目,是一个虚无的密封类,所以不可能被一而再,也不可能被实例化。
[2] 无法实例化。
特点:
[4] 不可能包涵实例构造函数。
[3]
静态类的真面目,是2个虚无的密封类,所以不可能被再三再四,也不可能被实例化。
该变量在全局数据区分配内部存款和储蓄器
静态局地变量
[5]
若是一个类上面包车型大巴持有成员,都亟待被共享,那么能够把那些类定义为静态类。
[4] 不能够包蕴实例构造函数。
开端化:假如不显式开头化,那么将被隐式开端化为0。
定义:在局地变量前增加static关键字时,就定义了静态局地变量。
2、静态类与私家构造函数不同:
[5]
如若3个类上边包车型客车装有成员,都急需被共享,那么能够把那个类定义为静态类。
中static静态变量的用法,static的用法详解。特点: A、该变量在全局数据区分配内部存款和储蓄器。
B、初叶化:借使不显式初步化,那么将被隐式伊始化为0。
C、它一向驻留在全局数据区,直到程序运维停止。但其作用域为局地作用域,当定义它的函数或 语句块甘休时,其功用域随之停止。
[1]
私有构造器方式照旧能够从类的在那之中对类进行实例化,而静态类禁止从别的地点实例化类,个中包含从类自己内部。
二、静态类与个人构造函数分裂:
静态局地变量
静态数据成员
特点: 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。这些重点字将类钦命为不可扩充;换言之,不能从它派生出别的类。
该变量在大局数据区分配内部存储器。
壹、通过static关键字修饰,是属于类,实例成员属于对象,在这几个类第3遍加载的时候,这些类上边包车型大巴拥有静态成员会被加载。
贰、静态变量
开端化:假设不显式发轫化,那么将被隐式发轫化为0。
static静态变量的实例与分析
2、静态成员只被创制一遍,所以静态成员唯有1份,实例成员有稍许个对象,就有稍许份。
一、通过static关键字修饰,是属于类,实例成员属于对象,在这几个类第三遍加载的时候,这么些类下边包车型客车具备静态成员会被加载。
它一向驻留在全局数据区,直到程序运营结束。但其成效域为一些作用域,当定义它的函数或 语句块甘休时,其作用域随之甘休。
实例:
3、类加载的时候,全数的静态成员就会被创制在“静态存款和储蓄区”里面,壹旦创设直到程序退出,才会被回收。
二、静态成员只被创制2次,所以静态成员唯有壹份,实例成员有多少个目的,就有多少份。
四、成员需求被共享的时候,方法供给被一再调用的时候,就能够把那些成员定义为静态成员。
美高梅开户网址, 三、类加载的时候,全体的静态成员就会被成立在“静态存款和储蓄区”里面,一旦创建直到程序退出,才会被回收。
静态数据成员
特点:
C# 代码 复制
5、在静态方法中,不能够一贯调用实例成员,因为静态方法被调用的时候,对象还有非常大或然不存在。
四、变量要求被共享的时候,方法需求被反复调用的时候,就足以把那一个分子定义为静态成员。
内部存款和储蓄器分配:
using System;
6、this/base 关键字在静态方法中无法接纳,因为有希望对象还不设有。
五、在静态方法中,无法间接调用实例成员,因为静态方法被调用的时候,对象还有希望不设有。
在程序的全局数据区分配。
7、能够创造那个类的指标,制定指标的分子在静态方法中操作。
6、this/base 关键字在静态方法中不能够运用,因为有望对象还不设有。
早先化和概念:
namespace teststatic
八、在实例方法中,能够调用静态成员,因为这一年静态成员肯定存在。
7、能够成立那么些类的靶子,制定目的的成员在静态方法中操作。
a、静态数据成员定义时要分配空间,所以无法在类注解中定义。
玖、非静态类能够包涵静态的格局、字段、属性或事件;
八、在实例方法中,能够调用静态成员,因为这年静态成员肯定期存款在。
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、无论对3个类创设多少个实例,它的静态成员都唯有多个副本;
九、非静态类能够涵盖静态的主意、字段、属性或事件;
10、无论对三个类创设多少个实例,它的静态成员都唯有2个副本;
1壹、静态方法和属性无法访问其富含类型中的非静态字段和事件,并且不可能访问任何对象的实例变量;
1二、静态方法只好被重载,而不可能被重写,因为静态方法不属于类的实例成员;
一3、即便字段不可能声称为 static const,但 const
字段的行事在精神上是静态的。那样的字段属于类,不属于类的实例。
c、静态数据成员因为程序1起初运维就必需存在,所以其早先化的特级地方在类的里边贯彻。
1壹、静态方法和属性不可能访问其包涵类型中的非静态字段和事件,并且不能访问任何对象的实例成员;
三、静态方法
特点
当今分析上边的代码:
1贰、静态方法只好被重载,而无法被重写,因为静态方法不属于类的实例成员;
1、静态方法是不属于特定对象的方法;
a、对相于 public,protected,private 关键字的熏陶它和一般性数据成员一致,
Console.WriteLine(string.Format(“i={0}”,i));
这里i是static变量,而且类class1是第1遍被引
用,要先为class一里面全体的static变量分配内部存款和储蓄器。尽管现行反革命有超线程技术,可是指令在逻辑照旧一条一条的按顺序执行的,所以
先为static int i分配内部存款和储蓄器,并且在该内部存款和储蓄器中保持int的缺省值0,接着再为static
int num 变量分配内存,值当然也为0。
一叁、固然字段不可能宣称为 static const,但 const
字段的表未来精神上是静态的。那样的字段属于类,不属于类的实例。
贰、静态方法能够访问静态成员变量;
b、因为其空间在全局数据区分配,属于全部本类的目的共享,所以,它不属于特定的类对象,在没发出类对象时其成效域就看得出,即在尚未生出类的实例时,大家就能够操作它。
然后实施第一步,为变量赋值:先为static int
i变量赋值,i=getNum(),看getNum里面的代码,就是return
num,今年num的值是0,于是i就为0了。然后对变量num赋值,num=一;那行代码执行后,num就为一了。
叁、静态方法
三、静态方法不得以一向访问实例变量,能够在实例函数调用的状态下,实例变量做为参数传给静态方法;
访问形式
之所以最终的结果为:
壹、静态方法是不属于特定指标的方法;
四、静态方法也无法一向调用实例方法,能够直接调用,首先要开创多少个类的实例,然后经过那壹一定目的来调用静态方法。
类对象名.静态数据成员名
i=0 j=1
2、静态方法能够访问静态成员;
4、静态构造函数
③、静态方法不可以直接待上访问实例成员,能够在实例函数调用的情形下,实例成员做为参数字传送给静态方法;
1、静态类能够有静态构造函数,静态构造函数不可三番五次;
二、静态构造函数能够用来静态类,也可用于非静态类;
三、静态构造函数无访问修饰符、无参数,唯有2个 static 标志;
4、静态构造函数不可被直接调用,当创造类实例或引用任张光杰态成员在此之前,静态构造函数被自动执行,并且只进行三遍。
静态数据成员,重要用在类的享有实例都存有的属性上。比如,对于二个存款类,帐号相对于各类实例都以区别的,但各种实例的利息率是平等的。所以,
应该把利息设为存款类的静态数据成员。那有五个好处,第壹,不管定义多少个存款类对象,利息数据成员都共享分配在全局区的内部存款和储蓄器,所以节省存贮空间。第一,
一旦利息要求转移时,只要改变二遍,则拥有存款类对象的利息率全改成过来了,因为它们其实是集体八个事物。
四、静态方法也无法一贯调用实例方法,能够间接调用,首先要创建二个类的实例,然后经过那1一定目的来调用静态方法。
例如:
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,因为静态构造函数只执行一次,所以不会再执行。
}
}
静态成员函数
特点:
一、静态类能够有静态构造函数,静态构造函数不可持续;
2、静态构造函数能够用来静态类,也可用以非静态类;
3、静态构造函数无访问修饰符、无参数,只有二个 static 标志;
4、静态构造函数不可被直接调用,当创设类实例或引用任石军态成员在此以前,静态构造函数被自动执行,并且只进行二回。
5、静态变量的储存
静态成员函数与类相关联,不与类的目的相挂钩。
例如:
使用 static
修饰符申明属于类型作者而不是属于特定指标的静态成员static修饰符可用于类、字段、方法、属性、运算符、事件和构造函数,但不能够用来索引器、析构函数或类以外的体系。
静态成员函数无法访问非静态数据成员。原因很简短,非静态数据成员属于特定的类实例。
作用:
静态全局变量
最主要用以对静态数据成员的操作。
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
该变量就被定义成为了三个静态全局变量。
调用情势:
特点:
类对象名.静态成员函数名()
A、该变量在全局数据区分配内部存款和储蓄器。
伍、静态成员的囤积
使用 static
修饰符表明属于类型作者而不是属于特定目的的静态成员static修饰符可用于类、字段、方法、属性、运算符、事件和构造函数,但不能够用来索引器、析构函数或类以外的连串。
静态全局变量
定义:在全局变量前,加上关键字 static
该变量就被定义成为了一个静态全局变量。
特点:A、该变量在全局数据区分配内部存储器。
B、开端化:如若不显式初叶化,那么将被隐式早先化为0。
静态局部变量
定义:在局部变量前增加static关键字时,就定义了静态局地变量。
特点:A、该变量在大局数据区分配内部存款和储蓄器。
B、开端化:要是不显式开首化,那么将被隐式起初化为0。
C、它始终驻留在全局数据区,直到程序运营结束。但其功用域为1些成效域,当定义它的函数或 语句块截止时,其功用域随之甘休。
静态数据成员
特点:
A、内部存款和储蓄器分配:在程序的全局数据区分配。
B、初阶化和概念:
a、静态数据成员定义时要分配空间,所以无法在类注脚中定义。
b、为了防止在四个应用该类的源文件中,对其重新定义,所在,不能在类的头文件中定义。
c、静态数据成员因为程序1开首运转就必需存在,所以其初阶化的特等地方在类的里边贯彻。
C、特点 a、对相于 public,protected,private
关键字的影响它和平凡数据成员一致,
b、因为其空间在大局数据区分配,属于持有本类的靶子共享,所以,它不属于特定的类对象,在没发生类对象时其成效域就看得出,即在并未发出类的实例时,我们就足以操作它。
D、访问形式 a、 类对象名.静态数据成员名
E、静态数据成员,重要用在类的全体实例都持有的习性上。比如,对于三个存款类,帐号相对于各样实例都以见仁见智的,但各类实例的利利息率是壹致的。所以,应该把利息设为存款类的静态数据成员。那有七个好处,第3,不管定义多少个存款类对象,利息数据成员都共享分配在全局区的内存,所以节省存贮空间。第1,壹旦利息须求改变时,只要改变三次,则装有存款类对象的利息率全改成过来了,因为它们其实是公共三个事物。
静态成员函数
特点: A、静态成员函数与类相联系,不与类的靶子相联系。
B、静态成员函数无法访问非静态数据成员。原因很简短,非静态数据成员属于特定的类实例。
作用: 重要用来对静态数据成员的操作。
调用方式: A、类对象名.静态成员函数名()
static静态变量的实例与分析,代码如下:
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();
}
}
分析下边包车型地铁代码:
Console.WriteLine(“i={0}”, i);
这里 i 是 static 变量,在类 Program 首先次被加载时,要先为
Program 中间有着的 static
变量分配内部存款和储蓄器。就算后天有超线程技术,不过指令在逻辑上大概种种的按顺序自上而下实行,所以
先为 static int i 分配内部存款和储蓄器,并且在该内部存款和储蓄器中保持int的缺省值0,接着再为
static int num 变量分配内存,值当然也为0。
然后第3步,为变量赋值:先为 static int i 变量赋值,i=getNum(),看
getNum() 里面包车型地铁代码,正是return num,那一年 num 的值是 0 ,于是 i=0
。然后对变量num赋值,num=壹;那行代码执行后,num就为一了。所以,j=一。
所以最终的结果为:
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变量,而且类class一是率先次被引
用,要先为class一里面有着的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=一;那行代码执行后,num就为一了。
C、它始终驻留在全局数据区,直到程序运转甘休。但其功效域为一些成效域,当定义它的函数或 语句块甘休时,其效用域随之甘休。
为此最终的结果为:
静态数据成员
特点:
i=0 j=1
A、内部存款和储蓄器分配:在程序的全局数据区分配。
B、初步化和定义:
a、静态数据成员定义时要分配空间,所以不可能在类申明中定义。
b、为了防止在七个利用该类的源文件中,对其再一次定义,所在,不可能在类的头文件中定义。
c、静态数据成员因为程序1早先运转就必需存在,所以其开始化的特等地点在类的里边贯彻。
C、特点
a、对相于 public,protected,private 关键字的震慑它和1般性数据成员一致,
b、因为其空间在大局数据区分配,属于持有本类的靶子共享,所以,它不属于特定的类对象,在没发生类对象时其成效域就看得出,即在并未有发出类的实例时,我们就足以操作它。
D、访问情势
a、 类对象名.静态数据成员名
E、静态数据成员,首要用在类的全体实例都持有的习性上。比如,对于二个存款类,帐号相对 于每一个实例都以见仁见智的,但每一种实例的利息率是一致的。所以,应该把利息设为存款类的静态数据成员。那有四个便宜,第三,不管定义多少个存款类对象,利息数据成员都共享分配在全局区的内部存款和储蓄器,所以节省存贮空间。第三,壹旦利息要求变更时,只要改变1遍,则持有存款类对象的利息率全改成过来了,因为它们其实是公共1个事物。
静态成员函数
特点:
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变量,而且类class一是率先次被引
用,要先为class一里面装有的static变量分配内部存款和储蓄器。固然现行有超线程技术,不过指令在逻辑仍然一条一条的按梯次执行的,所以
先为static int i分配内部存款和储蓄器,并且在该内存中保持int的缺省值0,接着再为static
int num 变量分配内存,值当然也为0。
然后实施第2步,为变量赋值:先为static int
i变量赋值,i=getNum(),看getNum里面包车型地铁代码,正是return
num,那年num的值是0,于是i就为0了。然后对变量num赋值,num=一;这行代码执行后,num就为1了。
为此最后的结果为:
i=0 j=1
首先分为两有的 寄存器和内部存款和储蓄器(包涵缓存)
内部存款和储蓄器分为两部分 代码和数量
数据分为两有的 静态存款和储蓄区和平运动行时存款和储蓄
运营时存储分为 堆栈 和 堆
静态存款和储蓄分为 全局静态存款和储蓄 和 常量