2011-09-10 32 views
2

例如,我有以下的靜態類:C#靜態成員的問題

public static class f 
{ 
    public static bool IS_GUEST = (HttpContext.Current.Session["uid"] == null); 
    public static bool IS_ADMIN = (HttpContext.Current.Session["admin"] != null); 
    //... 

現在,如果我檢查用戶是否是客戶或不使用IS_GUEST即使用戶不是客戶,我總是得到真(會話「uid」確實存在)。而對於IS_ADMIN,無論發生什麼,我總是會犯錯。會話是在我調用IS_GUEST和IS_ADMIN之前創建的,如果我手動檢查它(HttpContext.Currest.Session[something]),它會正常工作。 那麼這裏有什麼問題?

回答

3

靜態初始化程序在代碼中的任何方法之前運行。所以當你的字段被初始化時,HttpContext.Current.Session很可能沒有被初始化。改變他們的屬性,一切都應該按預期工作。

public static class f 
    { 
    public static bool IS_GUEST 
    { 
     get 
     { 
      return (HttpContext.Current.Session["uid"] == null); 
     } 
    } 
    public static bool IS_ADMIN 
    { 
     get 
     { 
      return (HttpContext.Current.Session["admin"] != null); 
     } 
    } 
+0

只有一個吸氣... – tvanfosson

+0

通過發佈實際的報告來闡明。 :) – DeCaf

+0

因爲在樣本OP中提供了他只有嘗試才能獲得價值。 – Samich

0

你當

0

。客人/管理日誌除了什麼無咖啡因說,靜態字段是在應用領域所有線程之間共享設置這些值。

全部請求在該應用程序域中運行的請求將在給定時間點共享相同的值。

0

存儲來自會話的靜態變量值是個壞主意。首先會話中的值可能會改變,但你的靜態變量不會改變。

可能是你正在尋找的東西是:

public static class f 
{ 
    public static bool IsGuest 
    { 
     get 
     { 
      return HttpContext.Current.Session["uid"] == null; 
     } 
    } 

    public static bool IsAdmin 
    { 
     get 
     { 
      return HttpContext.Current.Session["admin"] != null; 
     } 
    } 

    //... 
} 

在這種情況下,您可以訪問靜態變量像F.IsGuest,你將提供的最新信息。