我的代码中发生了一件奇怪的事情,我写了一些可以运行脚本的软件(反射),每个脚本都是一个单独的类库。这些脚本都包含相同的类库和一些方法和变量(所有静态变量和方法)。
,但现在一个奇怪的事情发生了,它看起来像一个脚本是改变另一个的静态库类中的值,我不知道这是如何可能的。有人能给我解释一下这是怎么回事吗?
…一个脚本正在更改另一个脚本的静态库类中的值
假设这是相同的静态类,跨多个库共享,那么您描述的行为是正确的。当你把一些东西做成static
,这意味着它属于类型而不是一个特定的对象,所以改变它意味着在引用/使用它的同一个应用域中的所有都将看到这些变化。
这里的脚本是指在不同线程中运行的代码。
静态类并不是真正的静态,它们可以被改变,在同一个应用域内的每个线程都可以看到静态类包含的相同数据。因此,一个线程对静态变量的更改将被所有其他线程看到。显然,除非类是线程安全的,否则这种行为是危险的,因此您可能希望在静态类中实现一些锁定。在c#中,静态并不意味着它的值不能被改变,相反,静态成员在内存中只有一个实例。这意味着,如果任何一行代码更改了静态成员,那么使用该成员的其他所有人都可以看到该更改。
因此你所面对的行为是完全好的。
如果你想要一个成员的值不能被改变,使用c#的const关键字。
看一下这个MSDN的例子