单个静态字段为何多值?测试代码val3输出1而非3的原因
泛型类静态字段行为的疑问解答
问题1:单个静态字段为何会存在多个值?
这是因为**.NET中的泛型类,每个不同的封闭构造类型都会拥有独立的静态成员副本**。简单来说,当你用不同的类型参数(比如string和int)实例化泛型类MyClass<T>时,CLR会为每个类型参数生成一个完全独立的类版本——你可以把MyClass<string>和MyClass<int>看作两个毫不相干的普通类,它们各自拥有自己的globalValue静态字段,彼此的状态完全独立。所以看起来是“同一个静态字段”,实际上是不同类里的独立字段,自然会有不同的值。
问题2:测试代码中val3的输出为1而非3,请解释原因。
先贴出你的测试代码:
private void test() { MyClass<string> c1 = new MyClass<string>(); int val1 = c1.IncrementGlobalValue();//--> 1 MyClass<string> c2 = new MyClass<string>(); int val2 = c2.IncrementGlobalValue();//--> 2 MyClass<int> c3 = new MyClass<int>(); int val3 = c3.IncrementGlobalValue();//--> 1 MyClass<int> c4 = new MyClass<int>(); int val4 = c4.IncrementGlobalValue();//--> 2 } internal class MyClass<T> { private static int globalValue = 0; internal int IncrementGlobalValue() { return ++globalValue; } }
核心原因还是泛型静态成员的独立特性:
c1和c2属于MyClass<string>这个封闭构造类型,它们共享同一个globalValue,所以两次调用后值从0→1→2;c3和c4属于MyClass<int>这个完全独立的封闭构造类型,它的globalValue是全新初始化的0,第一次调用IncrementGlobalValue()时,这个独立的字段被加1,所以val3的结果是1,而不是接着val2的2继续累加。
换句话说,MyClass<string>.globalValue和MyClass<int>.globalValue是两个完全不相关的静态变量,各自维护自己的状态,互不干扰。
内容的提问来源于stack exchange,提问作者Koray
相关产品推荐
相关产品推荐

