为何将泛型类型从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
相关产品推荐
相关产品推荐

