You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

单个静态字段为何多值?测试代码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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 07:52:35