2013-12-19 32 views
8

我了解与应用程序(控制台/窗口)相关的静态变量的生命周期,但我不确定是否了解在Web应用程序(asp.net, mvc,web api等)。根据我的理解,当IIS回收应用程序池时,静态变量将重置为其类型的默认值(integrals = 0,reference types = null等),但我想知道内联初始化程序是否在重新初始化后重新初始化回收或将类型默认总是分配不管?静态变量生命周期和应用程序池recylcing

实施例(一个或多个):

// example 1 
static class StaticRandom 
{ 
    private static Random rng = new Random(); 
} 

在上文中,将静磁场RNG被重新初始化为新的随机时要求的再循环后在第一时间()?或者我需要尝试使用变量,如之前实施null检查:

// 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中?

NOTE:我完全知道上面例子中的线程安全问题,它只是一个简单的例子来说明我的问题。在上述想法的现实世界中,我会实现一个适当的锁定模式。

+0

这并不是一件很难尝试自己的事情。在例子1的'Next'方法中放置一个断点,看看你在循环之后得到了什么作为'rng'的值。 –

+1

我认为只是要求澄清而不是加载我的本地服务器,并在我等待它进入循环哈哈的过程中旋转我的大拇指15分钟会容易得多。此外,有时候人们还会记住一些很好的知识。 –

+4

“等待它进入回收站”:打开IIS并自行回收应用程序池? –

回答

5

好吧,所以不能帮助自己,并做了一个快速测试。

这是相当多的,按您的例子1,除了与页面的输出,所以我能做到这一点,而不附加到进程,

它证实了我的想法 - 静态将被重置为内联初始化值。