您的位置:首页 > 其它

建议33:避免在泛型类型中声明静态成员

2016-09-01 14:33 176 查看
建议33:避免在泛型类型中声明静态成员

在上一建议中,已经理解了应该将MyList<int>和MyList<string>视作两个完全不同的类型,所以,不应该将MyList<T>中的静态成员理解成MyList<int>和MyList<string>共有的成员。

class MyList
{
public static int Count { get; set; }
public MyList()
{
Count++;
}
}

static void Main(string[] args)
{
MyList list1=new MyList();
MyList list2=new MyList();
Console.WriteLine(MyList.Count);
}


输入:

2

若果换成泛型:

class MyList<T>
{
public static int Count { get; set; }
public MyList()
{
Count++;
}
}

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);
}


输出为:

2

1

实际上,随着你为T指定不同的数据类型,MyList<T>相应地也变成不同的数据类型,它们之间是不共享静态成员的。

若T所指定的数据类型一致,那么两个泛型对象之间还是可以共享静态成员的,如上文中的list1和list2。但是为了避免因此引起的混淆,仍旧建议在实际编码过程中,尽量避免声明泛型类型的静态成员。

非泛型类型中静态泛型方法看起来很接近该例子,但是,非泛型中的泛型方法并不会在运行时的本地代码中生成不同的类型。

如下:

class MyList
{
static int count;
public static int Func<T>()
{
return count++;
}
}

static void Main(string[] args)
{
Console.WriteLine(MyList.Func<int>());
Console.WriteLine(MyList.Func<int>());
Console.WriteLine(MyList.Func<string>());
}


输出:

0

1

2

转自:《编写高质量代码改善C#程序的157个建议》陆敏技
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  泛型类型
相关文章推荐