C# 避免在泛型类型中的声明静态成员

在非泛型类型中,各个实例共享静态成员:

 1 class Program
 2 {
 3     static void Main(string[] args)
 4     {
 5         MyClass m1 = new MyClass();
 6         MyClass m2 = new MyClass();
 7         Console.WriteLine(MyClass.Count);
 8         Console.Read();
 9     }
10 }
11 class MyClass
12 {
13     public static int Count { get; set; }
14     public MyClass()
15     {
16         Count++;
17     }
18 }

运行结果:

2                                                        

现在将MyClass声明为泛型类型:

 1 class Program
 2 {
 3     static void Main(string[] args)
 4     {
 5         MyClass<int> m1 = new MyClass<int>();
 6         MyClass<int> m2 = new MyClass<int>();
 7         MyClass<string> m3 = new MyClass<string>();
 8         Console.WriteLine(MyClass<int>.Count);
 9         Console.WriteLine(MyClass<string>.Count);
10         Console.Read();
11     }
12 }
13 class MyClass
14 {
15     public static int Count { get; set; }
16     public MyClass()
17     {
18         Count++;
19     }
20 }

运行结果:

2
1

在代码里,创建实例时为T指定了不同的数据类型,MyClass相应地也变成了不同的数据类型,不同类型之间不共享静态成员;但是若T所指定的数据类型时一致的,那相同类型的实例是可以共享静态成员。

为了避免混淆,建议尽量避免在泛型类型中的声明静态成员。


 

非泛型类型中的泛型方法并不会在运行时的本地代码中生成不同的类型。

 1 class Program
 2 {
 3     static void Main(string[] args)
 4     {
 5         Console.WriteLine(MyClass.Func<int>());
 6         Console.WriteLine(MyClass.Func<int>());
 7         Console.WriteLine(MyClass.Func<string>());
 8         Console.Read();
 9     }
10 }
11 class MyClass
12 {
13     static int Count;
14     public static int Func()
15     {
16         return Count++;
17     }
18 }

运行结果:

0
1
2

 

参考:《编写高质量代码改善C#程序的157个建议》陆敏技

你可能感兴趣的:(C# 避免在泛型类型中的声明静态成员)