每个进程只有一个静态变量实例吗?

时间:2012-10-09 08:49:17

标签: c# .net oop assemblies static-members

如果我有以下课程:

public class MyClass { public static int MyStaticInt = 0; }

如果在一个解决方案中我在两个不同的程序集中引用MyNameSpace.MyClass.MyStaticInt,我指的是同一个变量吗?

6 个答案:

答案 0 :(得分:6)

默认情况下,静态状态的范围是AppDomain,如果您使用ThreadStatic属性,则可以按线程配置静态。

这意味着如果程序集在同一进程中运行并且进程只有一个应用程序域,那么您的假设是有效的。

答案 1 :(得分:5)

static可能意味着一些事情,具体取决于具体情况。

  • 默认情况下,您会获得每个AppDomain的值的一个实例。
  • 如果使用ThreadStatic属性进行修饰,则会获得每个线程值的一个实例。
  • 如果包含在泛型类中,则会获得每个具体类型的值的一个实例。

对于您的示例代码,第一个条件似乎是这种情况。在所有情况下,定义数据的特定程序集没有任何区别。

答案 2 :(得分:1)

是的,每个进程每个进程只有一个实例。

有一点需要注意的是,当你有泛型类时,每个泛型类的实例都有一个变量实例。即你有一个MyGenericClass实例和一个MyGenericClass实例。

修改

实际上每个AppDomain有一个实例,因此您可以通过自己创建多个AppDomain副本来创建多个副本。

答案 3 :(得分:0)

,MyClass.MystaticInt仅属于MyClass类的本地。

答案 4 :(得分:0)

我在“自定义”程序集中测试了静态实例,该程序集从两个位置加载: main 程序(第三方)和我的“自制的“插件,也由程序加载。我检查了AppDomain - 从两个地方加载“自定义”程序集时完全相同,唉是“自定义”中对象的静态实例装配不一样。因此,我必须得出结论,静态实例每个加载程序集的每个AppDomain都有上述单个值,如果再次加载程序集,那么它将不相同。

答案 5 :(得分:0)

类变量是静态的。 每个类加载器每个jvm只有一个类变量出现。