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

时间:2011-08-14 19:06:47

标签: c# asp.net static initialization static-constructor

在我的类中我有一个字符串对象的静态字典,其中包含大量的项目(它从文件中读取并初始化它们)我写了一个静态构造函数来执行此操作并且需要几秒钟,但我想要做一次更快,因为我在ASP.Net中这样做,我希望我的网站不要有这个开销,我该怎么办?如果这个构造函数为每个对象运行,那么我正在考虑一些方法,但我想我必须在用户运行的网站的每个页面中运行此方法,所以我想再次它会是相同的,我是对的吗? 什么是初始化一大组变量的解决方案?谢谢

2 个答案:

答案 0 :(得分:16)

每个AppDomain对类型运行一次。每个实例不一次。从C#4规范,第10.12节:

  

封闭类类型的静态构造函数在给定的应用程序域中最多执行一次。静态构造函数的执行由应用程序域中发生的以下第一个事件触发:

     
      
  • 创建了类类型的实例。
  •   
  • 引用类类型的任何静态成员。
  •   

请注意每个关闭类的部分内容。因此,如果您具有泛型类型Foo<T>,则Foo<string>Foo<object>(等)的单独类型,将具有单独的静态字段,并且将单独调用其静态构造函数。

答案 1 :(得分:4)

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

来自MSDN - Static Constructors

  

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