gpt4 book ai didi

asp.net - 静态字段初始值设定项有时会在 Application_start 之前运行

转载 作者:行者123 更新时间:2023-12-02 16:45:08 24 4
gpt4 key购买 nike

我有一个 ASP.NET Web 应用程序开始显示一些非常奇怪的行为。下面是一些示例代码:

// in Bar.cs
public class Bar {
public static Baz baz = Something.Step2();
}

// in Global.asax
public void Application_Start(...) {
Something.Step1();
}

这个故事的简短版本是这样的:在某些机器上,Something.Step2 在 Something.Step1 之前执行,并抛出无法处理的异常。在其他计算机上,Step1 在 Step2 之前正确执行。 Global.asax 及其使用的所有对象根本不引用 Bar。

静态字段何时应该相对于其他编程元素执行?为什么两台机器(都是 Win7 64 位,都带有 .NET 4.0,相同的 IIS 版本等)会以不同的顺序执行操作?每台机器上的顺序也是一致的。在我的机器上,它总是在Step1之前执行Step2,但在我同事的机器上,它总是在Step2之前执行Step1。

非常感谢您的帮助。

更新 我找到了我的静态字段被访问的根本原因。我的示例中的“Bar”类实际上是一个自定义身份验证模块,并在 web.config 中作为 System.webServer 下的身份验证处理程序引用。如果我从 web.config 中删除该行,我的系统将首先调用 Step1,而根本不会调用 Step2。我的问题巧妙地更改为:“为什么 web.config 会导致我的静态初始化程序触发,以及为什么会导致它们在 Application_Start 执行之前触发?”

最佳答案

静态字段初始值设定项,当您没有静态构造函数时,会在首次访问之前的“依赖于实现”的时间进行初始化。这意味着它们可以随时初始化 - 您不能依赖于第一次使用 Bar 时发生 Bar.Baz 的初始化。

Bar 添加静态构造函数会将其行为更改为更符合您的预期。

有关详细信息,请阅读 C# 语言规范第 10.5.5.1 节:

10.5.5.1 Static field initialization

The static field variable initializers of a class correspond to a sequence of assignments that are executed in the textual order in which they appear in the class declaration. If a static constructor (§10.12) exists in the class, execution of the static field initializers occurs immediately prior to executing that static constructor. Otherwise, the static field initializers are executed at an implementation-dependent time prior to the first use of a static field of that class.

此外,有关静态构造函数的详细信息,请参阅 10.2:

The static constructor for a closed class type executes at most once in a given application domain. The execution of a static constructor is triggered by the first of the following events to occur within an application domain:

· An instance of the class type is created.

· Any of the static members of the class type are referenced.

话虽这么说,如果需要确定性初始化,我强烈建议向 Something 添加静态构造函数,并在那里正确执行初始化。除了在这种情况下提供初始化顺序的保证之外,它还可以防止另一个类使用 Something 导致您的代码将来中断。

关于asp.net - 静态字段初始值设定项有时会在 Application_start 之前运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4053326/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com