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)单独实例化的。在本例中:
Father<int>、Father<Son1>、Father<Son2>是三个独立的封闭类型,各自拥有独立的静态变量副本。Son1.static_I实际指向Father<Son1>.static_I,初始值为0,赋值20后保持20。Son2.static_I指向Father<Son2>.static_I,与Father<Son1>无关,赋值30后保持30。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