我在代碼中發生了一件奇怪的事情,我寫了一些可以運行腳本(反射)的軟件,每個腳本都是一個單獨的類庫。這些腳本都包含與某些方法和變量相同的類庫(所有靜態變量和方法)。兩個不同的類庫共享一個靜態類庫
但現在weired的事情發生了,它看起來像一個腳本改變靜態庫類中的另一個內的值,我不知道這是怎麼可能的。能否解釋我在這裏發生了什麼?
我在代碼中發生了一件奇怪的事情,我寫了一些可以運行腳本(反射)的軟件,每個腳本都是一個單獨的類庫。這些腳本都包含與某些方法和變量相同的類庫(所有靜態變量和方法)。兩個不同的類庫共享一個靜態類庫
但現在weired的事情發生了,它看起來像一個腳本改變靜態庫類中的另一個內的值,我不知道這是怎麼可能的。能否解釋我在這裏發生了什麼?
...一個腳本改變靜態庫類中的另一個
鑑於這是同一個靜態類,在多個庫共享內的值,那麼你所描述的行爲是正確的。當你做的東西static
這意味着它屬於一個型而不是如此變化意味着一切引用/使用它會看到這些變化在同一應用程序域之內的特定對象。
「一切」表示「同一應用程序域內的所有內容」。 – 2013-05-07 13:11:50
@ErenErsönmez是的,我會更新清晰。 – James 2013-05-07 13:25:13
通過腳本我假設你的意思是代碼在不同的線程中運行。
靜態類並不是真正的靜態,他們是可以改變的,具有相同的應用程序域看到靜態類包含相同的數據內的每個線程。因此,所有其他線程都會看到一個線程對靜態變量的更改。顯然這種行爲是危險的,除非類是線程安全的,因此你可能想要考慮在靜態類中實現一些鎖定。
請注意,有['ThreadStaticAttribute'](http://msdn.microsoft.com/en-us/library/system.threadstaticattribute.aspx);標有它的字段不在線程之間共享。 – sloth 2013-05-07 13:14:59
@ Dominic Kextel,這樣做的竅門,但我認爲每個腳本都是一個不同的程序集,它們都會有一個獨立的靜態庫類,因此無法更改其他類,這是怎麼回事? – Jeffnl 2013-05-07 13:22:36
@傑夫不,不是這樣,請參閱我的答案。 – James 2013-05-07 13:26:16
是的......你需要更具體些。 – tnw 2013-05-07 13:07:36