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);
}
}