2012-04-10 62 views
0

堆棧溢出。假設我想初始化一個非靜態類變量,其中兩個是UserID(int)和MyDictionary(Dictionary)。這個非靜態類是在靜態類中聲明的(並且在靜態類的成員之一中初始化)。 如果腳本運行時間過長而另一用戶訪問同一頁面,則新用戶有可能會改變其他用戶的MyDictionary的內容。但我不明白這是如何可能的,因爲MyDictionary是在一個非靜態類。有沒有人明白這一點?謝謝。在靜態類中的ASP.NET非靜態類Thread-Safety

+0

你從哪裏得到它的一個用戶將能夠修改其他人使用的服務器端的東西?如果我沒有弄錯的話,服務器爲每個用戶提供獨立的線程和內存。另外,我建議您將所有課程放在單獨的文件中,除非您的私人課程僅用於一個班級。 – MarioDS 2012-04-10 22:40:18

回答

1

所以我假設代碼看起來有點像這樣的權利?

public class MyNonStaticClass 
{ 
    public int UserID; 

    public Dictionary<int, string> MyDictionary 
     = new Dictionary<int, string>; 
} 

public static class MyStaticClass 
{ 
    public static MyNonStaticClass aStaticInstanceOfTheNonStaticClass 
     = new MyNonStaticClass(); 

    public static void AddToDictionary(int key, string value) 
    { 
     aStaticInstanceOfTheNonStaticClass.add(key, value); 
    } 
} 

通過聲明靜態類內的對象作爲一個靜態變量,你基本上是說「在我的應用我想其中的一個;而只有其中一個」;所以即使班級不是靜態的,你仍然在創建一個靜態實例。

+0

男人,我想了一個小時左右,你的答案證實了這一點。謝謝。 – user1325179 2012-04-10 23:53:37

0

因爲包含類和訪問成員是靜態的,所以它使用單一的內存空間。你必須假定靜態類的引用(本例中爲本地,字段或屬性)也是靜態的(即使它們是非靜態類的實例)。

這個類是靜態的原因是什麼?如果你使用的是共享邏輯,爲什麼不通過引用靜態方法傳遞字典?

1

靜態(或缺乏)不是影響線程安全。靜態僅僅意味着類成員(屬性,字段,方法或構造函數)與類型相關聯,而不與類別的特定實例相關聯。

我可以編寫非線程安全的靜態代碼(如您在問題中描述的代碼),並且可以編寫線程安全的實例代碼,反之亦然。下面是一些非線程(壞)代碼,沿着什麼,我覺得你行或多或少都在做:

public static class MyFoo { 

    // Just because this is a static property doesn't 
    // mean the contained dictionary is thread safe! 
    public static Dictionary<String, String> MyDictionary { get; set; } 

    public static MyFoo() { 
     MyDictionary = new Dictionary<String, String>(); 
    } 
} 

如果你需要存儲用戶特定的信息在ASP.NET中使用會話對象或(對於更長壽命的數據)數據庫。永遠不要依賴靜態變量 - 如果兩個用戶同時在網站上,該怎麼辦?