ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

C# Net9的模块初始化器(Module Initializer)

C# Net9的模块初始化器(Module Initializer)

Module Initializer 是为了让库/框架在程序集加载时,以 “CLR 保证的、只运行一次的、不依赖类型访问的” 方式执行初始化逻辑,从而避免静态构造函数的副作用和性能问题。

为什么需要 Module Initializer?

1. 静态构造函数的问题

  • 触发时机不确定:CLR 保证在第一次访问类型前调用静态构造函数,但 你无法精确控制它什么时候运行。
  • 性能开销:CLR 对静态构造函数的类型会加锁,防止并发初始化,这会带来性能损耗。
  • 不能跨类型共享初始化逻辑:每个有静态构造函数的类都要单独处理,无法集中初始化。

2. 模块初始化器的优势

  • 只运行一次:在程序集加载时 由 CLR 自动调用一次,不依赖任何类型访问。
  • 无类型访问开销:不需要触发某个类型的静态构造函数来“顺便”初始化。
  • AOT 兼容的初始化逻逻辑

 

using System.Runtime.CompilerServices;class Program
{static void Main(){Console.WriteLine("Main");}
}class Init
{[ModuleInitializer]public static void Initialize(){Console.WriteLine("Module Initializer runs before Main!");}
}

输出:
Module Initializer runs before Main!
Main
 

 

返回列表