2013-02-05 151 views
0

我在一個解決方案中有2個控制檯應用程序(Console1和Console2)。這兩個應用程序都引用一個類庫(CL)。 CL包含一個靜態類(SC),其中包含根據構造函數設置的字段。靜態類構造函數和靜態類字段的範圍

我的問題是,如果我在Console1中調用靜態類,並且首先調用任何包含靜態方法的Console1的SC構造函數,並且在SC中設置字段。現在,如果我同時運行Console2,但是獨立運行並訪問SC,那麼靜態類SC的精確範圍是什麼?調用其在Console1中產生的構造函數的任何更改是否與在Console2中使用SC時的行爲有什麼關係?

+1

不,第二個控制檯應用程序將使用該靜態類的另一個實例。沒有危險 –

回答

3

範圍是AppDomain。

由於您有兩個單獨的進程,因此您有兩個單獨的AppDomain和兩個單獨的「實例」的靜態類。沒有國家共享 - 根本沒有。

+0

太好了,回答了我所有的問題。順便說一下,我在哪裏可以檢查未來,當我搜索「靜態類MSDN」時,我沒有發現任何對範圍的引用,至少在下一頁中沒有看到任何內容:http://msdn.microsoft。 com/en-us/library/79b3xss3.aspx –

+0

@Freddy:其中之一就是在你鏈接的那個頁面上記錄下來:「一個靜態構造函數只被調用一次,而一個靜態類在內存中一直存在程序所在的*應用程序域*。「。但它並沒有真正突出顯示,因爲這是一個基本概念,即具有相同類的兩個不同進程不共享任何狀態。這不僅限於C#,在C++,Java等方面也是一樣的。 –

+2

您的問題可能與靜態類有關,但您所得到的答案將歸結爲:如果您運行兩個單獨的項目實例,一個實例不會與另一個實例交互。事實上,你可以運行同一個項目的兩個實例,你將沒有問題。 –

1

如果Console1和Console2像兩個完全獨立的exe文件一樣獨立運行,SC構造函數將被再次調用,否則不會。

1

控制檯1和2作爲單獨的進程運行。每個進程都會加載程序集(每個應用程序域都是精確的),每個程序集都會初始化靜態構造函數等。因此'程序集的運行實例'是完全獨立的。

1

你的問題可能是關於靜態類,但是你得到的答案都歸結爲: 如果你運行兩個單獨的項目實例,一個實例中使用的類將不會與另一個實例交互。事實上,你可以運行同一個項目的兩個實例,你將沒有問題。 運行Microsoft word的兩個實例沒有什麼不同

+0

感謝指針,這使得它更清晰。 –