我在代码中发生了一件奇怪的事情,我写了一些可以运行脚本(反射)的软件,每个脚本都是一个单独的类库。这些脚本都包含与某些方法和变量相同的类库(所有静态变量和方法)。两个不同的类库共享一个静态类库
但现在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