泛型类和静态字段

本文关键字:字段 静态 泛型类 | 更新日期: 2023-09-27 18:36:45

有没有办法在几个不同的泛型类之间共享一个静态变量?

我有一堂课

class ClassA <T> : ObservableCollection<T> {
    static int counter;
    //...
}

以及具有不同参数实例化的几个实例,例如

ClassA<int> a = new ClassA<int>();
ClassA<double> b = new ClassA<double>();
ClassA<float> c = new ClassA<float>();

有没有办法让实例 a、b 和 c 共享静态字段计数器?

非常感谢任何答案和评论:)

泛型类和静态字段

您可以将

计数器包装在它自己的单例类中,然后从 A、B 和 C 引用计数器类。

静态字段依赖于它们的类(这是 C# 处理判断哪些静态成员是哪些成员的方式),当您传入不同的泛型类型时,您有效地定义了一个单独的类。

所以,没有。 像共享计数器这样的东西可能最好由任何调用"重要事物"的类来处理,因为无论如何,该类对该计数器的状态最感兴趣。 如果出于某种原因无法执行此操作(此类被一堆不相关的线程引用),那么您可以创建一个静态类来保存库的状态,但这会导致可测试性问题,因此如果可以的话,我会尽量避免它。

最简单的解决方案:

class Program
{
    static void Main(string[] args)
    {
        ClassA<int> a = new ClassA<int>();
        ClassA<double> b = new ClassA<double>();
        Console.WriteLine(a.GetCounterAndAddOne());
        Console.WriteLine(b.GetCounterAndAddOne());
        Console.Read();
    }
}
class BaseA
{
    protected static int counter = 0;
}
class ClassA<T> : BaseA
{
    public int GetCounterAndAddOne()
    {
        return BaseA.counter++;
    }
}

对 GetCounterAndAddOne 的第一次调用将计数器设置为 0,第二次调用将计数器设置为 1,它将根据需要继续进行。