【发布时间】:2011-04-18 09:59:58
【问题描述】:
问题具体与.Net有关。
假设基类 A 有 2 个派生类 B 和 C。此外,假设基类 A 有一个名为“s”的静态变量。这个静态变量值是在“B”和“C”之间共享,还是每个都有自己的静态变量副本。
我目前的知识表明静态变量通常在派生类之间共享,除非基类是通用的。如果基类是泛型的,则为其类型参数的每个唯一组合创建该类的唯一副本,并且该类的每个此类副本与该特定副本的派生类共享来自基类的相同 satatic 变量。
我实际上面临着一个非常独特的情况。就我而言,所有 A、B 和 C 都是非泛型的。 A 有一个静态成员。但是这个成员的值对于 B 和 C 是不同的,在我的理解中不应该是这种情况(除非我上面对静态变量的陈述是不正确的)。
编辑:
我的应用程序是一个 ASP.NET 应用程序。我正在继续调试这个,但根据我目前的评估,它的发生是这样的:
- 我在变量发生更改的地方放置了一个断点,并且在第一次命中该断点时它的值得到更新。
- 下一次命中断点时,变量已恢复为旧值并再次初始化。它是一个私有变量,只在一个地方更改。
我的猜测可能是应用程序域已回收或以某种方式从内存中卸载了该类。我还在调查这个问题,但感谢大家的回复。
【问题讨论】:
-
如果您可以构建一个简短但完整的代码示例,我们或许能够弄清楚发生了什么,或者通过尝试这样做,您可能会发现问题的原因。
-
我唯一的猜测是静态是否用 ThreadStaticAttribute 装饰,并且您正在从不同的线程观察它。
-
您关于泛型类的 cmets 暗示了一个混淆因素。具体的泛型类不是从假定的开放泛型“基类”“派生”的。
-
@Damien:很抱歉之前没有提供代码。但是@rdkliene 下面的代码已经足够好了。而且我没有用 ThreadStaticAttribute 装饰它。 @Aakash-我从未说过具体的泛型类派生自任何开放的泛型基类。简单来说,我的意思是通过替换所有类型参数的唯一组合,从泛型定义中“实例化”一个具体类。
-
除了 rdkliene 的代码没有出现您所观察到的问题,因此我们需要查看您的版本以找出差异。