如何在实际需要之前初始化C#静态类?

Ber*_*ard 15 c# static

我有一个带有静态构造函数的静态类,需要花费一些时间(10-15秒)来执行并完全初始化类.为了提高性能,我决定启用这个静态类,而不是在第一次需要它时,以便在实际需要使用时准备好.

我的第一个想法是为类创建一个Initialize()方法,但由于我已经有了一个静态构造函数,这个方法似乎不需要做任何事情,除了是调用显式初始化类而不访问其他任何一个的方法公共方法或财产.拥有一种不直接做任何事情的方法对我来说似乎并不合适.

然后我想我可以将代码从静态构造函数移动到这个Initialize()方法中,但是我还希望在首次需要时对类进行初始化,并且Initialize()不显式调用该方法.

总而言之,我希望遵守以下标准:

  • 我想允许显式初始化静态类(可能通过使用公共Initialize()方法).
  • 我不想在不需要它时访问类上的任何其他公共方法或属性,即使这会初始化静态类.
  • 如果该类尚未显式初始化,我仍然希望在首次需要时初始化它(即访问其他公共方法或属性时,意图使用它们提供的功能或数据).
  • 这是一个帮助类,使用Singleton设计模式对我来说不是必需的.

对于用C#编写的静态类,遵循上述标准的正确方法是什么?这也适用于其他编程语言(例如Java),但我个人对使用C#编写的解决方案感兴趣.

vcs*_*nes 19

我会使用初始化方法(编辑:请参阅Jon的答案).但是如果你真的只想使用构造函数,你可以这样做:

var type = typeof (YourType);
System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(type.TypeHandle);
Run Code Online (Sandbox Code Playgroud)

RunClassConstructor允许您强制类构造函数(静态构造函数)运行(如果它已经没有).如果它已经运行,比如因为你使用了类的静态成员,那么这没有效果.再运行一次没有效果.


Jon*_*eet 15

我可能只是去寻找Initialize方法 - 它可以做一些有用的事情:

  • 它可以记录您明确尝​​试使用堆栈跟踪初始化类
  • 如果已经通过另一个Initialize调用初始化了类,则可能会抛出异常
  • 可能(通过一些努力和重组)对事物进行排序,以便在初始化期间导致的任何异常都会传播,而不会TypeInitializationException通常获得.