.
静态构造函数
一:特点
1:静态构造函数既没有访问修饰符,也没有参数。
2:如果没有编写静态构造函数,而这时类中包含带有初始值设定的静态字段,那么编译器会自动生成默认的静态构造函数。
3:在创建第一个类实例或任何静态成员被引用时,.NET将自动调用静态构造函数来初始化类,也就是说我们无法直接调用静态构造函数,也就无法控制什么时候执行静态构造函数了。
4:如果类中包含用来开始执行的 Main 方法,则该类的静态构造函数将在调用 Main 方法之前执行。
5:如果类中的静态字段带有初始化,则静态字段的初始化语句将在静态构造函数之前运行。
6:一个类只能有一个静态构造函数。
7:无参数的构造函数可以与静态构造函数共存。尽管参数列表相同,但一个属于类,一个属于实例,所以不会冲突。
8:最多只运行一次。
9:静态构造函数不可以被继承。
二 :需求
1.为什么使用静态构造函数?
类有一些静态字段和属性,需要在第一次使用类之前,从外部源中初始化这些静态字段和属性
2.静态构造函数什么时候执行
CLR不能确定静态构造函数什么时候执行,也不能预计不同类的静态构造函数按什么顺序执行,但可以明确的是,静态构造函数之多执行一次,即在引用类之前执行在C#中,静态构造函数通常在第一次调用类的成员之前执行
3.静态构造函数有访问修饰符吗?
没有。因为,C#代码从不调用它,但在加载类时,总是由,CLR调用它。对于C#来说是私有的吧
4.静态构造函数可以有参数吗?
不能有参数。
5.一个类可以有多个静态构造函数吗?
一个类只能有一个静态构造函数
6.静态构造函数可以访问实例成员吗?
显然不能。只能访问静态成员
7.一个类可以同时拥有午餐的静态构造函数和实例构造函数吗?
可以。因为,静态构造函数是在加载类时执行的,而实例构造函数是在创建实例时执行的,所以两者不会有冲突
三:示例
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的静态成员,
// 转到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
这个说的比较清楚,我也学习了。 |