一访问修饰符限制
- 静态构造函数不能有访问修饰符。它既不能被声明为
public、private、protected,也不能是internal。这是因为静态构造函数是由.NET 运行时自动调用的,而不是由用户代码直接调用,所以不需要(也不允许)通过访问修饰符来控制访问权限。例如,下面的代码是错误的:
class MyClass
{
private static MyClass()
{
// 这是错误的,不能有访问修饰符
}
}
二 参数限制
- 静态构造函数不能带有参数。它的定义形式固定为
static关键字加上类名和一对空括号。这是因为静态构造函数的调用是由运行时控制的,运行时不会传递参数给它。如果尝试定义一个带有参数的静态构造函数,编译器会报错。例如:
class MyClass
{
static MyClass(int value)
{
// 这是错误的,静态构造函数不能有参数
}
}
三执行次数限制
- 静态构造函数在一个类的生命周期内只会执行一次。具体来说,当第一次访问类的静态成员或者创建类的第一个实例(如果类包含实例成员)时,.NET 运行时会加载该类并执行静态构造函数。之后,无论再如何访问静态成员或者创建实例,静态构造函数都不会再次执行。例如:
class MyClass
{
static MyClass()
{
Console.WriteLine("静态构造函数执行");
}
public static void StaticMethod()
{
// 第一次调用StaticMethod时,静态构造函数会执行
// 之后再次调用StaticMethod,静态构造函数不会执行
}
}
四不能直接调用限制
- 程序员不能在代码中直接调用静态构造函数。它是由.NET 运行时自动触发的,目的是确保类的静态成员在被使用之前完成初始化。如果试图在代码中像调用普通方法一样调用静态构造函数,编译器会报错。例如:
class MyClass
{
static MyClass()
{
Console.WriteLine("静态构造函数");
}
public static void Main()
{
MyClass(); // 这是错误的,不能直接调用静态构造函数
}
}
五继承中的限制
- 静态构造函数不能被继承。也就是说,子类不会继承父类的静态构造函数。当子类被加载时,如果它有自己的静态构造函数,那么它自己的静态构造函数会被执行,而与父类的静态构造函数无关;如果子类没有静态构造函数,那么只有父类的静态构造函数(如果有)在父类被加载时执行。例如:
class ParentClass
{
static ParentClass()
{
Console.WriteLine("父类静态构造函数执行");
}
}
class ChildClass : ParentClass
{
static ChildClass()
{
Console.WriteLine("子类静态构造函数执行");
}
}
-
当第一次访问
ChildClass的静态成员时,首先会执行ParentClass的静态构造函数(如果还没执行),然后执行ChildClass的静态构造函数。//实例化子类
//ChildClass dd=new ChildClass();
非静态构造函数 先执行父类构造函数,然后执行子类构造函数
静态构造函数,先执行子类函数,然后执行父类构造函数
静态和非静态可以同时存在
//实例化子类
//ChildClass dd=new ChildClass();
// 非静态构造函数 先执行父类构造函数,然后执行子类构造函数
// 静态构造函数,先执行子类函数,然后执行父类构造函数
public class ParentClass
{
static ParentClass()
{
Console.WriteLine("父类静态构造函数执行");//父类构造含税一定会执行
}
public ParentClass()
{
Console.WriteLine("父类非静态构造函数");
}
}
public class ChildClass : ParentClass
{
//原来可以共存
static ChildClass()
{
Console.WriteLine("子类静态构造函数执行"); //有子类构造函数,则先执行
}
public ChildClass()
{
Console.WriteLine("子类非静态构造函数");
}
}