大风车01

归来仍少年

通过实现集合来理解泛型

1.普通集合

实现一个string类型的集合,可以添加string类型元素和根据索引读取基本功能。

 1  internal class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             ArrayStr arrayStr = new ArrayStr();
 6             arrayStr.Add("1");
 7             arrayStr.Add("2");
 8             string name = arrayStr[0];
 9             Console.WriteLine(name);
10         }
}
11 12 //定义string类型集合 13 public class ArrayStr 14 { 15 16 public ArrayStr() 17 { 18 _items = new string[1]; //初始化 19 } 20 21 private string[] _items; 22 23 private int _count; 24 25 public int Count 26 { 27 get { return _count; } 28 } 29 30 public void Add(string item) 31 { 32 _items[_count] = item; 33 _count++; 34 35 string[] temp = new string[_items.Length + 1]; //动态扩容 36 for (int i = 0; i < _items.Length; i++) 37 { 38 temp[i] = _items[i]; //扩容后拷贝 39 } 40 _items = temp; 41 } 42 43 public string this[int index] 44 { 45 get { return _items[index]; } 46 set { _items[index] = value; } 47 } 48 } 49 50

 

但是如果要处理int 类型或其他的元素,是不是应该再实现一个int类型集合或其他类型集合,这时候如果实现一个Object类型集合,就是可以兼容多种类型数据。

2.Object集合

 1  internal class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             //引用
 6             ArrayObject arrayObject = new ArrayObject();
 7             arrayObject.Add("1"); //装箱
 8             arrayObject.Add(2);   //装箱
 9             string name = (string)arrayObject[0]; //拆箱
10             int key = (int)arrayObject[1];        //拆箱
11 
12             Console.WriteLine(key + ":" + name);
13             Console.ReadKey();
14         }
}
15 16 //定义object类型集合 17 internal class ArrayObject 18 { 19 public ArrayObject() 20 { 21 _items = new object[1]; //初始化 22 } 23 24 private object[] _items; 25 26 private int _count; 27 28 public int Count 29 { 30 get { return _count; } 31 } 32 33 public void Add(object item) 34 { 35 _items[_count] = item; 36 _count++; 37 38 object[] temp = new object[_items.Length + 1]; //动态扩容 39 for (int i = 0; i < _items.Length; i++) 40 { 41 temp[i] = _items[i]; //扩容后拷贝 42 } 43 _items = temp; 44 } 45 46 public object this[int index] 47 { 48 get { return _items[index]; } 49 set { _items[index] = value; } 50 } 51 52 53 54 }

 

虽然实现了可以支持不同类型数据的集合,但是我们看使用这个集合的时候,每次都要进行类型转换,就是我们所说拆箱和装箱的行为。而且如果对集合进行了多处写入了不同类型,那在读数据的时候强转类型的时候就会报错,那还得进行类型判断之后再转换,这两点就足够麻烦了。所以下面看看实现泛型集合,是否可以解决这些问题。

 

3.泛型集合

 1     internal class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             //使用
 6             ArrayList<string> arrayObject = new ArrayList<string>();
 7             arrayObject.Add("泛型");
 8 
 9             string name = arrayObject[0];
10 
11 
12             Console.WriteLine(name);
13             Console.ReadKey();
14         }
15     }
16     //泛型集合
17     internal class ArrayList<T>
18     {
19         public ArrayList()
20         {
21             _items = new T[1];  //初始化
22         }
23 
24         private T[] _items;
25 
26         private int _count;
27 
28         public int Count
29         {
30             get { return _count; }
31         }
32 
33         public void Add(T item)
34         {
35             _items[_count] = item;
36             _count++;
37 
38             T[] temp = new T[_items.Length + 1]; //动态扩容
39             for (int i = 0; i < _items.Length; i++)
40             {
41                 temp[i] = _items[i];                       //扩容后拷贝
42             }
43             _items = temp;
44         }
45 
46         public T this[int index]
47         {
48             get { return _items[index]; }
49             set { _items[index] = value; }
50         }
51 
52     }

 

在使用的时候就开始声明类型,在写入的时候那就对类型有约束了,不会写入其他类型,并且读数据时候可以直接用该类型来接收,最重要的是可以实现不同类型的集合功能。

 

4.总结

       这个就是泛型的作用,这里举例的是实现支持不同类型元素的集合功能,现实代码中可能有通用的处理数据方法或者类,接口等都可以用泛型来支持不同类型参数,而我们只需要写一个方法或类。它从广泛角度上来讲就是一个类似公司的合同模板,每位员工的劳动合同模板都是一样,员工就是不同类型。.net提供了泛型这一特性,就是相当于提供了一个代码模板,对于开发过程中可以便捷很多,在实际编译代码的时候,系统会将模板中的比如T的类型占位,替换成实际的类型,再进行编译。

 

 

 

 

posted on 2022-10-26 11:47  大风车01  阅读(38)  评论(0编辑  收藏  举报

导航