我了解与应用程序(控制台/Windows)相关的静态变量的生命周期,但我不确定我是否了解它们在 Web 应用程序(asp.net、mvc、web api 等)上下文中的生命周期.
据我所知,当 IIS 回收应用程序池时,静态变量被重置为其类型的默认值(整数 = 0,引用类型 = null 等),但我想知道内联初始化器是否在回收后重新初始化还是无论如何都会分配类型默认值?
示例:
// example 1
static class StaticRandom
{
private static Random rng = new Random();
}
在上面,静态字段rng在回收后第一次调用时会重新初始化为new Random()吗?或者我是否需要在尝试使用变量之前执行空值检查,例如:
// example 2
static class StaticRandom
{
private static Random rng = null;
public static Next()
{
if (rng == null)
rng = new Random();
return rng.Next();
}
}
我是否正确地假设在 IIS 回收之后,示例 1 中的 rng 变量在像示例 2 中那样重新初始化之前将为空?
注意:我完全清楚上面例子中的线程安全问题,这只是一个简单的例子来说明我的问题。在上述想法的真实场景中,我将实现适当的锁定模式。
最佳答案
好吧,所以忍不住,做了一个快速测试。
这与您的示例 1 非常相似,除了页面输出,所以我可以在不附加到流程的情况下完成,
它证实了我的想法——静态将被重置为内联初始化值。
关于c# - 静态变量生命周期和应用程序池回收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20671150/