建议33:避免在泛型类型中声明静态成员
2016-09-01 14:33
176 查看
建议33:避免在泛型类型中声明静态成员
在上一建议中,已经理解了应该将MyList<int>和MyList<string>视作两个完全不同的类型,所以,不应该将MyList<T>中的静态成员理解成MyList<int>和MyList<string>共有的成员。
输入:
2
若果换成泛型:
输出为:
2
1
实际上,随着你为T指定不同的数据类型,MyList<T>相应地也变成不同的数据类型,它们之间是不共享静态成员的。
若T所指定的数据类型一致,那么两个泛型对象之间还是可以共享静态成员的,如上文中的list1和list2。但是为了避免因此引起的混淆,仍旧建议在实际编码过程中,尽量避免声明泛型类型的静态成员。
非泛型类型中静态泛型方法看起来很接近该例子,但是,非泛型中的泛型方法并不会在运行时的本地代码中生成不同的类型。
如下:
输出:
0
1
2
转自:《编写高质量代码改善C#程序的157个建议》陆敏技
在上一建议中,已经理解了应该将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个建议》陆敏技
相关文章推荐
- 编写高质量代码改善C#程序的157个建议——建议33:避免在泛型类型中声明静态成员
- 编写高质量代码改善C#程序的157个建议[优先考虑泛型、避免在泛型中声明静态成员、为泛型参数设定约束]
- 编写高质量代码改善C#程序的157个建议[优先考虑泛型、避免在泛型中声明静态成员、为泛型参数设定约束]
- C#避免在泛型类型中声明静态成员
- 关于 swift 开发的变量或属性声明的建议(避免类型转换以及带来的强转崩溃问题)
- 为什么C++类定义中,数据成员不能被指定为自身类型,但可以是指向自身类型的指针或引用?为什么在类体内可以定义将静态成员声明为其所属类的类型呢 ?
- 对map, vector类型的静态成员初始化
- main()方法为啥必须要public static void类型的??java中的静态成员
- serializable类未声明类型为long的静态终态UID
- 如何获得一个未声明泛型集合的泛型类型?
- LCC编译器的源程序分析(15)结构类型成员的声明
- 3.4.2 泛型类型的静态构造函数
- 类的静态数据成员的声明、初始化及使用
- serializable 类 ****未声明类型为 long 的静态终态 serialVersionUID 字段
- main()方法为啥必须要public static void类型的??java中的静态成员
- 解决方案:静态成员对象的声明在头文件中,函数代码在另外一个文件中,提示链接错误
- 在外围类作用域之外引用外围类的静态成员,类型名和枚举名都要求有解析操作符
- main()方法为啥必须要public static void类型的??java中的静态成员
- C# 2005如何根据类型声明的字符串反射创建泛型(Generic)对象
- 只能在静态类型或顶级类型中才能声明静态方