2013-12-19 174 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,除了與頁面的輸出,所以我能做到這一點,而不附加到進程,

它證實了我的想法 - 靜態將被重置爲內聯初始化值。