55.泛型父类中定义静态成员的行为

  1. 55.泛型父类中定义静态成员的行为
    1. 55.1 题目
    2. 55.2 深入解析
    3. 55.3 答题示例
    4. 55.4 关键词联想

55.泛型父类中定义静态成员的行为


55.1 题目

class Father<T>
{
    public static int static_I = 0;
}

class Son1 : Father<Son1>
{
}

class Son2 : Father<Son2>
{
}

class Program
{
    static void Main(string[] args)
    {
        Son1.static_I = 20;
        Son2.static_I = 30;
        Console.WriteLine(Father<int>.static_I);
        Console.WriteLine(Father<Son1>.static_I);
        Console.WriteLine(Son1.static_I);
        Console.WriteLine(Son2.static_I);

        Console.ReadKey();
    }
}

泛型父类中定义了一个静态成员属性。有两个子类都继承该泛型父类。请问打印结果是什么?为什么?


55.2 深入解析

会打印0,20,20,30

因为静态成员属于类而不是实例,泛型类型参数 T 的变化会让父类“类型”变化。不同类型的泛型实例,它们的静态成员 static_I 是分别存在的,不会相互影响。


55.3 答题示例

“打印结果是:

0
20
20
30

这是因为C#中泛型类的静态成员是按封闭类型(Closed Type)单独实例化的。在本例中:

  1. Father<int>Father<Son1>Father<Son2> 是三个独立的封闭类型,各自拥有独立的静态变量副本。
  2. Son1.static_I 实际指向 Father<Son1>.static_I,初始值为0,赋值20后保持20。
  3. Son2.static_I 指向 Father<Son2>.static_I,与 Father<Son1> 无关,赋值30后保持30。
  4. Father<int>.static_I 未被显式赋值,保持默认值0。

因此,每个封闭类型的静态变量相互隔离,修改一个不会影响其他类型的静态变量。”


55.4 关键词联想

  • 泛型封闭类型(Closed Generic Types)
  • 静态成员实例化(Static Member Instantiation)
  • 类型参数唯一性(Type Parameter Uniqueness)
  • 泛型类继承(Generic Class Inheritance)
  • 静态变量隔离(Static Variable Isolation)
  • 运行时类型生成(Runtime Type Generation)
  • 与非泛型静态成员对比
  • typeof(Father<T>) 差异


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏