在.Net Framework 2.0发布后,泛型就已经深入人心。在CF2.0中也加入了泛型,但大家可知道CF2.0 与非精简版中泛型的区别呢?下面将详细叙述,我在.Net CF中使用泛型的几个注意事项。
泛型介绍:
泛型类和泛型方法同时具备可重用性、类型安全和效率,这是非泛型类和非泛型方法无法具备的。
举例:原先使用集合类型存储数据,数据量大后,装箱拆箱不但影响效率,而且也非安全,毕竟存放 进集合的都是Object对象。泛型对象在声明后,即定义好存放的类型,避免装箱拆箱及数据转换。
泛型的使用面很广,有泛型类、泛型接口、泛型方法、泛型委托等。那么多的使用面给开发人员提供 了相当大的便捷。
在我的实际应用中,发现.Net CF的泛型不支持2点。
1.不支持泛型递归嵌套
大家可能很奇怪,什么叫泛型递归嵌套。泛型递归嵌套即泛型的对象类型中仍然使用该泛型本身,举 例:List<List<int>>。既然泛型允许存放任何类型,那当然应该支持存放一个泛型对象, 否则也谈不上泛字吧。在非精简版中,是支持泛型嵌套的,但可惜精简版中不支持。
2.在泛型方法中,最多支持8个泛型参数。
泛型方法中,我们可以约束实际的参数个数,而不必约束对象类型,这样大大提高了可重用性。不必 类似以前猛定义Object。精简版中同样不支持。
实际测试如下:
开发平台:VS2008,Windows Mobile 5.0, .Net Compact Framework 2.0
1.在.Net Framework下的代码:
Program.cs
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5
6namespace ConsoleGenericApp
7{
8 class Program
9 {
10 static void Main(string[] args)
11 {
12 MyClass1<int> clsA = new MyClass1<int>();
13 clsA.clsB = new MyClass1<MyClass1<int>>();
14
15 MyClass2<int> cls2 = new MyClass2<int>();
16
17 MyClass3<UserInfo> cls3 = new MyClass3<UserInfo> ();
18
19 System.Console.WriteLine(GetInfo<string>("1", "2", "3", "4"));
20
21 System.Console.WriteLine(GetInfo1<string>("1", "2", "3", "4", "5", "6", "7", "8", "9"));
22
23 System.Console.WriteLine(GetInfo2<UserClass1, UserClass2, UserClass3, UserClass4>
24 (new UserClass1(), new UserClass2(), new UserClass3(), new UserClass4()));
25
26 System.Console.WriteLine(GetInfo2<int, string, float, decimal, UserClass1, UserClass2, UserClass3, UserClass4, UserClass5>
27 (1, "2", 3.0f, 4.2m, new UserClass1(), new UserClass2(), new UserClass3(), new UserClass4(), new UserClass5()));
28
29 System.Console.ReadLine();
30 }
31 private static string GetInfo<T>(T t1, T t2, T t3, T t4)
32 {
33 return string.Format("info : {0} , {1} ,{2}, {3} ", t1.ToString (), t2.ToString(), t3.ToString(), t4.ToString());
34 }
35
36 private static string GetInfo1<T>(T t1, T t2, T t3, T t4, T t5, T t6, T t7, T t8, T t9)
37 {
38 return string.Format("info : {0} , {1} ,{2}, {3}, {4}, {5}, {6}, {7}, {8}", t1.ToString(), t2.ToString(), t3.ToString(), t4.ToString(), t5.ToString(), t6.ToString(),
39 t7.ToString(), t8.ToString(), t9.ToString());
40 }
41
42 private static string GetInfo2<T1, T2, T3, T4>(T1 t1, T2 t2, T3 t3, T4 t4)
43 {
44 return string.Format("info : {0} , {1} ,{2}, {3} ", t1.ToString (), t2.ToString(), t3.ToString(), t4.ToString());
45 }
46
47 private static string GetInfo2<T1, T2, T3, T4, T5, T6, T7, T8, T9> (T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8, T9 t9)
48 {
49 return string.Format("info : {0} , {1} ,{2}, {3}, {4}, {5}, {6}, {7}, {8}", t1.ToString(), t2.ToString(), t3.ToString(), t4.ToString(), t5.ToString(), t6.ToString(),
50 t7.ToString(), t8.ToString(), t9.ToString());
51 }
52 }
53}