静态全局变量与静态局部变量的定义及特点详解
[id_1083542889]

在全局变量之前加上关键字 static ,这样该变量就被定义成了一个静态全局变量。
特点:
A、该变量在全局数据区分配内存。
B、初始化:如果不显式初始化,那么将被隐式初始化为0。
当在局部变量前加上 static 关键字时,就对静态局部变量进行了定义。
特点:
A、该变量在全局数据区分配内存。
B、初始化:如果不显式初始化,那么将被隐式初始化为0。
它一直停留在全局数据区,直至程序运行完毕。然而,它的作用域是局部作用域,一旦定义它的那个函数或者语句块结束,它的作用域也就结束了。
静态数据成员
特点:
A、内存分配:在程序的全局数据区分配。
B、初始化和定义:
a、静态数据成员定义时要分配空间,所以不能在类声明中定义。
b、为避免在多个使用该类的源文件里对其进行重复定义,所以不能在类的头文件中进行定义。
静态数据成员需要在程序一开始运行时就存在,所以它的初始化最佳位置是在类的内部实现。
C、特点
对于 public、protected、private 关键字来说,它的影响与普通数据成员相同。
也就是说,在没有产生类的实例的时候,我们就可以对它进行操作。
D、访问形式
a、 类对象名.静态数据成员名
静态数据成员主要用于类的所有实例都具备的属性。例如,对于一个存款类而言,帐号对于每个实例是不同的,然而每个实例的利息却是相同的。因此,应当将利息设置为存款类的静态数据成员。这样做有两个好处,其一,无论定义多少个存款类对象,利息数据成员都能共享分配在全局区的内存,从而节省存储空间。第二,当利息需要改变时,仅需改变一次,那么所有的存款类对象的利息就都会随之改变。这是因为它们实际上是共同使用一个东西。
静态成员函数
特点:
A、静态成员函数与类相联系,不与类的对象相联系。
静态成员函数无法访问非静态数据成员。原因在于非静态数据成员是属于特定类实例的。
作用:
主要用于对静态数据成员的操作。
调用形式:
类对象名.静态成员函数名()
static静态变量的实例与分析
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("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
当进行一次引用类的操作时,会先按顺序为类中的静态变量分配内存空间。在全部完成内存空间的分配之后,接着会按顺序为静态变量进行赋值。
静态(static)有哪些优点呢?为何要运用静态变量或函数呢?
有些经常使用的东西,倘若每次使用都重新创建(new),那么这种开销可能会很大。要是使用 static ,让其一直存放在内存中,这样想用的时候就能直接使用,无需重新创建(new)一块空间来初始化数据。所以 static 是为了达成系统的缓存作用,它的生命周期会持续到应用程序退出才结束。
静态成员包含静态字段与静态属性。静态成员与类存在关联,它不依靠对象而存在。并且,静态成员只能被类所访问,而不能被对象所访问。
静态成员归类所有。无论创建多少个实例对象,静态成员在内存中都只有一份。实例成员归类的实例所有。每创建一个实例对象,实例成员就会在内存中分配一块内存区域。
静态成员通常被用来存放一些可以共享的数据段,例如数据库连接字符串等。
如果一个类仅仅包含静态成员和静态方法,那么这个类能够被定义为静态类,并且需要给这个类加上 static 修饰符。
静态方法和非静态方法:
性能方面:静态方法与实例方法的差别不是很大。所有的方法,无论是静态方法还是实例方法,都是在 JIT 加载类的时候分配内存。其不同之处在于,静态方法是以类名来引用,而实例方法则是对对象实例进行引用。在创建实例的时候,不会再次为类的方法分配内存,所有的实例对象都共同使用一个类的方法代码。所以,静态方法和实例方法在调用时,在性能上的差异是非常小的。
二、静态方法只能由类访问;实例方法只能由对象访问。
优点:
1,静态变量在类载入时,就装入内存
使用时,若不使用 New,就意味着不必创建类中的所有对象,也能够调用某个方法。
缺点:
垃圾回收机制无法回收静态变量,而静态类变量会一直存留在内存中。
c#中静态类的优缺点 缺点:
整个类型在程序运行期间仅加载一次。对于那些经常被使用的类型而言,无需在每次使用前都先进行加载,这样效率会更高。然而,对于那些不常使用的类型来说,情况则有所不同。
如果是静态类型,就会一直占用一定的内存。这种占用会一直持续到程序停止,或者应用程序域被卸载。因此,应该只将那些经常使用的类型定义为静态类型。
优点:
1、它们仅包含静态成员。
2、它们不能被实例化。
3、它们是密封的。
4、它们不能包含实例构造函数(C# 编程指南)。
因此创建静态类和创建仅包含静态成员且有私有构造函数的类情况大致相同。私有构造函数的作用是阻止类被实例化。
使用静态类有其优点。编译器可以执行检查,这样就能确保不会偶然地添加实例成员。并且编译器还将保证不会创建此类的实例。
静态类具有密封性,所以不能被继承。静态类不能包含构造函数,不过依然可以声明静态构造函数来进行初始值的分配或者某个静态状态的设置。