2011-03-24 24 views
2

我知道在ASP.Net項目中創建一個靜態類會導致該類的運行時屬性可用於Web服務器上的所有會話。ASP.Net正常類內的靜態類

我的問題是這樣的:如果我聲明嵌套類是靜態的,但容器不是,跨會話共享類仍然適用?

實施例:

public class FooContainer 
    { 

     public static class Bar 
     { 
     } 

     public static class dog 
     { 
     } 
    } 
+1

你爲什麼要那樣做?真正的問題是什麼? – 2011-03-24 14:26:19

+0

我希望能夠使用像屬性這樣的靜態類,但只是將子類更改回正常併爲它們創建屬性訪問器。 – callisto 2011-03-25 12:51:13

回答

2

最終,是的。

嵌套靜態類與根級靜態類(Marc明智地注意到涉及泛型的細微差別)相同 - 唯一的區別是類型路徑的限定,但這只是自然的任何環境,而不是一個副作用。

4

是;一個靜態嵌套類與任何其他靜態類具有相同的行爲。唯一的時候,嵌套類的行爲是不同的,當外部類是泛型類型(嵌套類型然後通過父類隱式通用,所以FooContainer<X>.Bar將獨立於FooContainer<Y>.Bar)。

只是要小心:會話之間共享數據的靜態是充滿危險的。像偏執狂一樣同步。就我個人而言,我需要一個很好的理由來做到這一點......並且需要認真執行。我只使用這種方法來配置緩存等,然後我對瘋狂地小心一些。

1

當我在同一句話中看到有人說「靜態數據」和「ASP.NET」時,各種警報都會消失。

是的,正如馬克說,靜態類是靜態的,即使他們是嵌套的,你只需要通過包含類

MyStaticClass.StaticField = 3; ///wont work 
MyInstanceClass.MyStaticClass.StaticField = 3; // works 

任何實例化的類可以有靜態方法/屬性/構造函數來調用它們,使一個類明確靜態只是有一個額外的好處,你不能讓我的錯誤是非靜態的,澄清了類的目的和意圖。

但請注意,ASP.net中的靜態類在應用程序級別是靜態的,因此如果您有多個用戶,它們將看到相同的靜態數據,而不管授權如何,並且數據的更改將影響所有使用它的用戶。
因此,一個靜態變量可能是正確的地方,把從數據庫中讀取一次,然後顯示的東西,即當前版本的應用程序,或應用程序的開始時間,,但它是一個非常錯誤的地方用戶特定的數據喜歡語言偏好,用戶名等,等等......

+0

感謝您的明確答案。 – callisto 2011-03-25 12:49:20