.NET中静态的知识
1,C#中没有全局变量的概念,这意味着所有的成员变量只有该类的实例才能操作这些数据。所以出现了静态变量的概念,保存类的公共信息,所有该类的实例共享该值。有时要对这些静态变量从外部源中进行初始化,所以就有了静态构造函数。
静态变量也有修饰符:public,protected,private和internal。
静态方法与静态变量一样,不属于任何特定的实例,属于类全体成员共有,用类名来调用。
静态方法只能访问类的静态成员,不能访问类的非静态成员,因为静态方法是通过类来调用的,而这时候有可能类没有实例化;非静态方法可以访问类的静态成员,也可以访问非静态成员。
静态变量在声明开始,就一直存储在内存中,直到整个程序终止。而实例成员在创建对象时分配内存。静态变量的生存周期为应用程序和存在周期;
2,静态构造函数是C#的一个新特性,在编程过程中用处并不广,它的主要目的是用于初始化一些静态变量。
因为静态构造函数是属于类的,而不属于任何一个实例,所以静态构造函数只会被执行一次,而且是在创建此类的第一个实例或引用任何静态成员之前,由.NET自动调用的。确切的说,静态构造函数是在加载类时执行的。
因为静态构造函数是.NET调用的,所以修饰符就没有意义了,也不能有参数,也就是说一个类中只能有一个静态构造函数。可以说静态构造函数是私有的。
在创建第一个类实例或任何静态成员被引用时,.NET将自动调用静态构造函数来初始化类。也就是说我们无法直接调用静态构造函数,也不可能知道静态构造函数何时会被调用。
无参数的构造函数可以与静态构造函数共存,因为一个属于类,一个属于实例。静态构造函数是在加载类时执行的,而实例构造函数是在创建实例时执行的。
静态构造函数最多只运行一次。
静态构造函数不可以被继承。
如果没有写静态构造函数,而类中包含带有初始值设定的静态成员,那么编译器会自动生成默认的静态构造函数。
如果类中包含用来开始执行的Main方法,则该类的静态构造函数将在调用Main方法之前执行。静态构造函数是在加载类时执行的。
如果类中的静态字段带有初始化,则静态字段的初始化语句将在静态构造函数之前运行。
3,下面看一个经典的例子:
class A
{
public static int X;
static A() //④ 执行完后返回到③
{
X = B.Y + 1;
Console.WriteLine("static A()");
}
}
class B
{
public static int Y = A.X + 1; //③ 调用了A的静态成员,当引用静态成员时CLR自动调用静态构造函数,转到A的静态构造函数---->
static B() //② 如果带有初始值设定项的静态字段,执行该类的静态构造函数时,先要按照文本顺序执行那些初始值设定项。转到初始值设定项---->
{
Console.WriteLine("static B()");
}
static void Main() //① 程序入口, 如果类中包含用来开始执行的Main()方法,该类的静态构造函数将在调用Main()方法之前执行。这样转到类B的静态构造函数---->
{
Console.WriteLine("X = {0}, Y = {1}", A.X, B.Y);//⑤ 输出结果
Console.ReadLine();
}
}
执行结果:X=1;Y=2
由此可以看出,当类中有静态变量时,执行顺序为:当编译时就为类中的静态变量分配内存并赋初始值(整型为0),如果静态变量在定义时就有初始值语句,则执行该语句为它赋初值,再执行静态构造函数,再执行Main()方法。如果只有静态变量而没有静态构造函数则自动添加一个静态构造函数,在Main()执行前先执行静态构造函数,在静态构造函数执行前首先执行静态变量的赋值语句。
4,Main()函数是程序的入口,要确保首先执行,所以要定义成为静态的。
5,类中的静态变量是在一开始就分配内存并初始化好的,而类中的非静态变量是在创建实例时分配内存并初始化的。