在C#中,静态构造函数的调用时机是什么?其主要用途有哪些?
考察说明
考查对C#静态构造函数调用时机和作用的掌握程度。
回答思路
- 【回答框架 1】静态构造函数在类型首次被使用前由CLR自动调用,具体时机包括:创建第一个实例、访问静态成员或继承类中的静态成员。它不接受参数,无访问修饰符,且仅执行一次。
- 【回答框架 2】其主要作用包括:初始化静态字段、执行一次性的资源加载或配置设置。它不能直接调用,也无法控制执行顺序,若抛出异常,类型将不可用。
- 【回答框架 3】静态构造函数与实例构造函数不同,实例构造函数每次创建对象时调用,而静态构造函数只运行一次。此外,静态构造函数会阻塞调用线程直至完成,且可能影响性能。
- 【回答框架 4】若静态构造函数未定义,编译器会隐式生成一个静态构造函数来初始化静态字段为默认值或显式赋值。但显式定义时,可以执行更复杂的初始化逻辑。
- 【回答框架 5】在继承场景中,静态构造函数先于派生类静态构造函数调用,但顺序可能不保证。因此,避免在静态构造函数中依赖其他类型的静态状态。
- 【关键点 1】静态构造函数在首次使用类型前自动执行一次,且无法手动调用。
- 【关键点 2】主要用于初始化静态成员或执行一次性资源准备。
- 【关键点 3】若静态构造函数抛出异常,CLR会将其包装为TypeInitializationException,且类型在进程内不可再用。
- 【易错点 1】静态构造函数中不应进行耗时操作或访问可能未初始化的其他类型静态成员,以免造成死锁或初始化顺序问题。
- 【易错点 2】不要假设静态构造函数的执行顺序,尤其是在多个类型相互依赖时。
- 【易错点 3】避免在静态构造函数中捕获异常后继续使用类型,因为类型可能处于未初始化的不一致状态。