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