静态变量生存期和应用程序池重新计划

Mik*_*son 9 .net c# asp.net iis static-variables

我理解与应用程序(控制台/窗口)相关的静态变量的生命周期,但我不确定我是否在Web应用程序(asp.net,mvc,web api等)的上下文中理解它们的生命周期.

根据我的理解,当IIS回收应用程序池时,静态变量会重置为其类型的默认值(积分= 0,引用类型= null等),但我想知道内联初始化程序是否在回收后重新初始化,或者是类型默认值总是可以分配?

例子):

// example 1
static class StaticRandom
{
    private static Random rng = new Random();
}
Run Code Online (Sandbox Code Playgroud)

在上面,当循环后第一次调用时,是否会将静态字段rng重新初始化为新的Random()?或者在尝试使用变量之前是否需要实现空检查,例如:

// example 2
static class StaticRandom
{
    private static Random rng = null;

    public static Next()
    {
        if (rng == null)
            rng = new Random();
        return rng.Next();
    }
}
Run Code Online (Sandbox Code Playgroud)

我是否正确假设在IIS回收后,示例1中的rng变量将为null,直到重新初始化为例如示例2?

注意:我完全了解上面示例中的线程安全问题,这只是一个简单的例子来说明我的问题.在上述想法的真实场景中,我将实现适当的锁定模式.

Jon*_*ton 6

好吧,所以无法帮助自己,并做了快速测试.

这几乎与你的例子1一样,除了页面输出,所以我可以做到这一点,而不是附加到过程,

它确认了我的想法 - 静态将重置为内联初始化值.