2013-05-07 80 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