2009-11-20 106 views

回答

2

可以與多個單個進程 線程導致靜態類是 創造了不止一次?

不,多個線程都將指向相同的靜態類。

如果我只需要一個簡單的構造可以 我用一個靜態類,還是我要 再打單身?

不太明白你的問題。但是一般情況下,當你需要全局數據訪問時,你使用Singleton。您可以使用靜態成員與靜態類相同的東西。但是這使得代碼更醜陋,因爲有太多的靜態關鍵字,如果你想放棄全局訪問策略並使用更多的OOP方法,就會讓你的生活變得困難。

然而,與靜態類相比,單例是一種更受歡迎的方法。

編輯:您可能需要閱讀此:static classes are not thread-safe

+0

您已經回答了我的問題:) 對於我正在處理的特定問題,我需要在兩個線程之間全局訪問一個資源。我讓他們用一個名爲EventWaitHandle的信號互相發送信息,但是之後需要發送一個字符串到另一個字符串。我把它放在一個Queue中的靜態類中,它被lock(){}保護,以便被另一個線程檢索,但是不確定2個線程是否會得到相同的靜態類。 – 2009-11-20 15:17:17

0

不能創建一個靜態類... 但正常類的靜態實例的實例,將超過所有線程相同

2

我覺得當你說「創建」你真的是指「實例化」,實例化是創建該類的一個對象。靜態類永遠不會實例化。它們本質上是全局變量和函數的集合。

每個靜態成員變量的一個實例在運行時創建,它們將在所有線程之間共享。

+0

我不同意。任何嘗試訪問它們的靜態類都會被實例化。他們有自己的靜態構造函數,您可以在其中定義自己的邏輯。 – 2009-11-20 15:21:02

+0

儘管「靜態構造函數」背後存在着令人奇怪且令人困惑的命名決定,但沒有創建靜態類的實例。該類正在被加載,初始化,使用,但* not *「實例化」。 – 2009-11-20 15:33:51

+0

+1 YES ...靜態類未實例化。類型結構爲您的應用程序中使用的每種類型創建一次,不是類型的實例或instaiation ...它是一個類型定義結構。 @myotherm,此類型結構(稱爲CORINFO_CLASS_STRUCT)包含Runtimetype信息。當一個對象被實例化時,對象頭部包含一個指向這個東西的指針。 – 2009-11-20 15:35:33

6

是的靜態類可以作爲一個類似單例的構造。它包含的所有靜態成員只會存在一次 - ,但是每個AppDomain(只要記住一個進程可以有多個(獨立的).NET AppDomains)。

+2

不要忘記ThreadStaticAttribute。 – GvS 2009-11-20 15:16:29

+0

一個進程如何擁有超過1個AppDomain? – 2009-11-20 15:18:28

+0

+1,AppDomains。 – meklarian 2009-11-20 15:23:46

1

可以與多個單個進程 線程導致靜態類是 創造了不止一次?

不管線程的數量多少,在一個進程中獲取多個靜態.NET類(成員)的多個實例的唯一方法是創建新的AppDomain。每個AppDomain將有一個靜態類(成員)的實例。

AppDomain Class @ MSDN

編輯:

我要補充的是在過程和應用程序域的數目的線程數是分開爲好。如果需要,單線程進程可創建任意數量的AppDomain。此外,只有程序流程是否有任何額外的線程調用其他AppDomain。這可能會造成多線程訪問靜態類的多個實例的情況,但除非您自己明確創建此場景,否則不會發生這種情況。

如果我只需要一個簡單的構造可以 我用一個靜態類,還是我要 再打單身?

這似乎不清楚你要在這裏問什麼。靜態類成員按概念表示單身人士。如果你問這是否是一個創建簡單構造的好方法,那麼答案可能是。這取決於你的需求。大多數人會爭辯說,你應該只使用一個常規的類定義並且只創建一個實例。

鑑於你的兩個問題的聯合,我會推測,也許你問是否可以通過使用靜態類創建一個單例作爲一個單例。答案是肯定的,因爲除非您的代碼明確創建了一個新的AppDomain,否則您將不會自動擁有新的AppDomain,或者您導入的代碼使用您的程序集創建新的AppDomain。

0

具有多個線程的單個進程是否會導致多次創建一個靜態類?

Yes you can,雖然它有點不尋常(甚至想)。它需要單獨的AppDomain或使用ThreadStaticAttribute。這兩者中的任何一個都會爲您提供一個不與其他靜態實例共享狀態的獨立實例。

如果我只是需要一個簡單的構造,我可以使用靜態類,或者我必須訴諸單身?

您可以使用。單例允許你像靜態一樣使用非靜態類,並且爲管理生命期提供了一些額外的靈活性。

相關問題