2011-02-09 18 views
1

讓我們考慮一下這個頁面的代碼隱藏:同一個ASPX頁面的所有實例是否共享相同的靜態字段?

public partial class Products : Page 
{ 
    private static SomeClass SharedField; 

    public Product() 
    { 
     // ... Some logic 
    } 
} 

是否所有Products頁面實例共享相同的SharedField,我知道這是靜態字段的一個基本概念。但在這種情況下,真的嗎?所有用戶都可以訪問(並且不能擁有自己的實例)到網站級別的相同靜態字段?

如果是這樣,Web開發人員會在哪些方面使用?或者這是不推薦的做法?

回答

2

是的,所有用戶都會有一個該靜態字段的實例,但只能在單個工作進程中執行。如果你有網絡農場/網絡園,他們將各自擁有自己的靜態實例。如果工作進程重新啓動,您將獲得一個新的靜態實例。

您必須在該共享字段周圍使用鎖定才能確保線程安全。

至於爲什麼要使用它,我不知道,我從來沒有這樣做。我可以給你的最好的例子是內置的靜態HttpContext.Current,它允許你訪問請求,響應等。

+0

`但僅限於單一的工作進程...`+1 – 2011-02-09 21:50:30

2

SharedField將在網站的整個生命週期的一個實例中可用。

要更多地瞭解它,see this answer

0

一個更好的做法是將你的對象存儲在應用程序狀態。

Application["MyObject"] = new SomeClass();

+0

不管你信不信,微軟表示,使用靜態代替。 http://stackoverflow.com/questions/4879023/what-is-the-life-span-of-a-field-in-a-static-class/4879119#4879119 – Greg 2011-02-09 21:39:50

相關問題