C# 静态构造函数有什么限制?

151 阅读3分钟

访问修饰符限制

  • 静态构造函数不能有访问修饰符。它既不能被声明为publicprivateprotected,也不能是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();

非静态构造函数 先执行父类构造函数,然后执行子类构造函数

QQ_1735541419455.png

静态构造函数,先执行子类函数,然后执行父类构造函数

QQ_1735541558324.png

静态和非静态可以同时存在

    //实例化子类
    //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("子类非静态构造函数");
       }
    }