在上一个建议中,已经解释了应该将MyList<int>和MyList<string>视作两个完全不同的类型,所以,不应将MyList<T>中的静态成员理解成为MyList<int>和MyList<string>共有的成员。
对于一个非泛型类型,以下的代码很好理解:
static void Main(string[]args)
{
MyList list1=new MyList();
MyList list2=new MyList();
Console.WriteLine(MyList.Count);
}
class MyList
{
public static int Count{get;set;}
public MyList()
{
Count++;
}
}
代码的输出为:
2
如果将MyList换成泛型类型,下面的代码输出会是什么?
static void Main(string[]args)
{
MyList<int>list1=new MyList<int>();
MyList<int>list2=new MyList<int>();
MyList<string>list3=new MyList<string>();
Console.WriteLine(MyList<int>.Count);
Console.WriteLine(MyList<string>.Count);
}
class MyList<T>
{
public static int Count{get;set;}
public MyList()
{
Count++;
}
}
代码的输出为:
2
1
实际上,随着你为T指定不同的数据类型,MyList<T>相应地也变成了不同的数据类型,在它们之间是不共享静态成员的。
不过,从上文我们也觉察到了,若T所指定的数据类型是一致的,那么两个泛型对象间还是可以共享静态成员的,如上文的list1和list2。但是,为了规避因此而引起的混淆,仍旧建议在实际的编码工作中,尽量避免声明泛型类型的静态成员。
上面举的例子是基于泛型类型的,非泛型类型中静态泛型方法看起来很接近该例子,但是应当始终这样来理解:
非泛型类型中的泛型方法并不会在运行时的本地代码中生成不同的类型。
所以下面的代码:
static void Main(string[]args)
{
Console.WriteLine(MyList.Func<int>());
Console.WriteLine(MyList.Func<int>());
Console.WriteLine(MyList.Func<string>());
}
class MyList
{
static int count;
public static int Func<T>()
{
return count++;
}
}
输出为:
0
1
2