2013-05-07 77 views
0

我在代碼中發生了一件奇怪的事情,我寫了一些可以運行腳本(反射)的軟件,每個腳本都是一個單獨的類庫。這些腳本都包含與某些方法和變量相同的類庫(所有靜態變量和方法)。兩個不同的類庫共享一個靜態類庫

但現在weired的事情發生了,它看起來像一個腳本改變靜態庫類中的另一個內的值,我不知道這是怎麼可能的。能否解釋我在這裏發生了什麼?

+0

是的......你需要更具體些。 – tnw 2013-05-07 13:07:36

回答

1

...一個腳本改變靜態庫類中的另一個

鑑於這是同一個靜態類,在多個庫共享內的值,那麼你所描述的行爲是正確的。當你做的東西static這意味着它屬於一個型而不是如此變化意味着一切引用/使用它會看到這些變化在同一應用程序域之內的特定對象。

+1

「一切」表示「同一應用程序域內的所有內容」。 – 2013-05-07 13:11:50

+0

@ErenErsönmez是的,我會更新清晰。 – James 2013-05-07 13:25:13

0

通過腳本我假設你的意思是代碼在不同的線程中運行。

靜態類並不是真正的靜態,他們是可以改變的,具有相同的應用程序域看到靜態類包含相同的數據內的每個線程。因此,所有其他線程都會看到一個線程對靜態變量的更改。顯然這種行爲是危險的,除非類是線程安全的,因此你可能想要考慮在靜態類中實現一些鎖定。

+0

請注意,有['ThreadStaticAttribute'](http://msdn.microsoft.com/en-us/library/system.threadstaticattribute.aspx);標有它的字段不在線程之間共享。 – sloth 2013-05-07 13:14:59

+0

@ Dominic Kextel,這樣做的竅門,但我認爲每個腳本都是一個不同的程序集,它們都會有一個獨立的靜態庫類,因此無法更改其他類,這是怎麼回事? – Jeffnl 2013-05-07 13:22:36

+0

@傑夫不,不是這樣,請參閱我的答案。 – James 2013-05-07 13:26:16

0

在C#中,靜態並不意味着它的值不能被改變,相反,靜態成員在內存中只有一個實例。這意味着如果任何代碼行更改了一個靜態成員,則該更改將對使用該成員的其他人可見。

因此,您所面對的行爲是完全正確的。

如果您希望成員的值不能更改,請使用C#的const關鍵字。

看看this MSDN示例。

+0

我知道價值可以改變,但我認爲如果你把它包含在不同的assemblers中,那麼每個都會有自己的靜態變量,但是現在我知道不是這種情況。 – Jeffnl 2013-05-07 13:45:01