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

为何将泛型类型从int改为string时静态计数器会重置?

C#泛型类静态成员独立的原因解析

在C#中,每一个通过不同类型参数实例化的泛型类,都是完全独立的运行时类型,它们各自拥有专属的静态成员副本,彼此的静态状态完全隔离,不会共享。

对应你代码里的场景:

  • 当你创建NamedContainer<int>的实例a、b、c时,所有操作都针对同一个运行时类型的静态_counter变量,所以每次实例化都会让这个计数器累加,输出从1到3符合预期。
  • 而当你创建NamedContainer<string>的实例d时,这是一个全新的、和NamedContainer<int>毫无关联的运行时类型,它的静态_counter会从零开始初始化,第一次实例化后自然输出1。

你可以通过输出类型全名验证这一点:

Console.WriteLine(typeof(NamedContainer<int>).FullName);
Console.WriteLine(typeof(NamedContainer<string>).FullName);

运行后会看到两个不同的类型标识,这直接证明它们是两个独立的类型。

如果想要让所有泛型实例共享同一个计数器,可以把静态成员放到非泛型的嵌套类或基类中,比如:

public class NamedContainer<T>
{
    // 嵌套非泛型类存储共享静态成员
    private static class SharedCounter
    {
        public static int Value;
    }

    public NamedContainer(T item, string name)
    {
        SharedCounter.Value++;
        Item = item;
        Name = name;
    }

    public T Item { get; }
    public string Name { get; }
    public int Counter { get => SharedCounter.Value; }
}

这样不管实例化时用int还是string类型,都会共享同一个计数器。

内容的提问来源于stack exchange,提问作者bigSloppy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 17:52:07