在C#中,静态构造函数是针对每个对象的初始化运行,还是只运行一次?

4

在我的类中,我有一个静态字符串字典对象,其中包含大量的项(从文件中读取并初始化)。我编写了一个静态构造函数来执行此操作,它需要几秒钟时间。但是我希望只执行一次以提高速度,因为我是在ASP.Net中执行此操作,并且不希望我的网站拥有这种负载。我该怎么办?如果此构造函数对每个对象都运行,则我认为可以使用某种方法,但我想必须在用户运行的每个网页上运行此方法,所以我认为这样做仍然会产生相同的问题,我对吗?如何初始化一组大变量仅一次?谢谢。

2个回答

17
它每个AppDomain仅对类型运行一次,而不是每个实例。来自C# 4规范第10.12节:
“封闭类类型的静态构造函数在给定应用程序域中最多执行一次。触发静态构造函数的执行的事件是以下事件中发生的第一个事件:”
  • 创建类类型实例。
  • 引用类类型的任何静态成员。
请注意关于它是针对封闭类的部分。因此,如果您有一个泛型类型Foo<T>,那么Foo<string>是与Foo<object>(等)不同的类型,将具有单独的静态字段,并将单独调用其静态构造函数。

4

它只在应用程序的生命周期内运行一次。

来自MSDN - 静态构造函数

静态构造函数用于初始化任何静态数据,或执行仅需要执行一次的特定操作。它会在创建第一个实例或引用任何静态成员之前自动调用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接