C# 类的静态构造函数

48 阅读2分钟

1 定义与基本概念

  • 在 C# 中,静态构造函数是一种特殊的构造函数,用于初始化类的静态成员。它的定义方式是使用static关键字,并且没有访问修饰符(既不能是public,也不能是private等),也没有参数。例如:
class MyClass
{
    static MyClass()
    {
        // 静态构造函数的代码块
    }
}
  • 静态构造函数在类被加载到内存时自动执行,且只会执行一次。这与实例构造函数不同,实例构造函数是在创建类的对象时执行,每创建一个新对象就会执行一次实例构造函数。

2 执行时机

  • 类加载时触发

当第一次访问类的静态成员(如静态字段、静态方法或嵌套类型)时,.NET 运行时会自动加载该类并执行静态构造函数。例如,假设有以下代码:

class Program
{
    static void Main()
    {
        Console.WriteLine(MyClass.StaticField);
    }
}
class MyClass
{
    public static int StaticField;
    static MyClass()
    {
        StaticField = 10;
    }
}
  • Main方法中,当访问MyClass.StaticField时,.NET 运行时会先加载MyClass,然后执行其静态构造函数,将StaticField初始化为 10。

  • 只执行一次

无论之后创建多少个类的实例,或者再次访问静态成员,静态构造函数都不会再次执行。这保证了静态成员的初始化操作只会进行一次,有助于提高性能和保证数据的一致性。

3 用途

  • 初始化静态字段

这是静态构造函数最常见的用途。可以在静态构造函数中为静态字段赋初始值,特别是当这些初始值的计算比较复杂或者需要一些初始化逻辑时。例如:

class MathUtils
{
    public static readonly double PI;
    static MathUtils()
    {
        PI = 3.14159265358979323846;
    }
}
  • 加载外部资源

    如果类需要使用外部资源,如读取配置文件、加载数据库连接字符串等,也可以在静态构造函数中完成这些操作。例如:

class DatabaseConnection
{
    public static string ConnectionString;
    static DatabaseConnection()
    {
        // 从配置文件中读取连接字符串
        ConnectionString = ConfigurationManager.AppSettings["ConnectionString"];
    }
}
  • 初始化静态集合或其他复杂数据结构

当类中有静态集合(如List<T>Dictionary<K,V>等)时,可以在静态构造函数中对其进行初始化,包括添加初始元素、设置容量等操作。例如:

class MyCollectionClass
{
    public static List<int> StaticList;
    static MyCollectionClass()
    {
        StaticList = new List<int>();
        StaticList.Add(1);
        StaticList.Add(2);
        StaticList.Add(3);
    }
}