泛型与非泛型的区别及详细解释

使用集合组织相关数据

1:简介
我们都知道数组是一组具有相同数据类型的数据的集合,在程序中可以存储数据,但是数组有一个缺点,即当其中的元素初始化后,要在程序中动态的给数组添加,或删除某个元素是很困难的。那么如何解决这个问题?.NET给我们提供了各种集合对象,如ArrayList和Hashtable。它们都可以很好的进行元素的动态添加,删除等操作。此外还要介绍C#中的一个重要概念——泛型。

2:ArrayList
1:ArrayList非常类似于数组,也有人称它为数组列表,ArrayList是一个可动态维护的集合。数组的容量是固定的,而ArrayList的容量是可以根据需要自动扩充,它的索引会根据程序的扩展而重新进行分配和调整。ArrayList提供了一系列的方法对其中的元素,进行访问增加,删除的操作。

2:和数组类似,ArrayList中存储的数据称为元素;ArrayList可以保存的元素就是ArrayList的容量,其默认初始容量为0;可以通过索引访问ArrayList中的元素,索引从0开始。

3:ArrayList类属于System.Collections命名空间,这个命名空间包含接口和类,这些接口和类定义各种对象(如列表,队列,位数组,哈希表和字典)的集合,ArrayList就属于集合中的一种,因此在使用ArrayList类之前一定要引入System.Collection命名空间。

4:需要注意的是,ArrayList是动态可维护的,因此定义时既可以指定容量,又可以不指定容量。

5:ArrayList的常用属性及方法
在这里插入图片描述
6:ArrayList通过Add()方法添加元素,该方法说明如下
返回值:值是一个int整型,用于返回所添加的元素的索引。
参数:如果向ArrayList中添加的元素是值类型,这些元素就会装箱处理转换为Object引用类型,然后保存。因此ArrayList中所有元素都是对象的引用。

3:Hashtable
1:在ArrayList集合中我们使用索引访问它的元素,但是使用这种方式必须了解集合中某个数据的位置。当ArrayList中的元素变化频繁时,要跟踪某个元素的下标就比较困难了。那么能不能给集合中的每个元素分别起一个有意义的关键字,然后通过关键字来访问其中的元素呢?

2:C#为我们提供了一种称为Hashtable的数据结构,通常称为哈希表,也有人称为“字典”。使用字典这个名称是因为其数据构成非常类似于现实生活中的字典。在一本字典中我们通过一个单词查找关于这个单词的更多信息。Hashtable的数据是通过键(Key)和值(value)来组织的。Hashtable也属于System.Collection命名空间,它的每个元素都是一个键/值对。

3:Hashtable的常用方法及属性
在这里插入图片描述4:注意:由于Hashtable不能用索引访问,所以遍历一个Hashtable只能用foreach()方法,以下示例:

//遍历Key
foreach(Object obj in enineers.Keys)
{
	Console.WriteLine((string)obj);
}
//遍历value
foreach(Object obj in enineers.Values)
{
	SE se = (SE)obj
	Console.WriteLine(se.Name);
}

//遍历Hashtable还可以采用下面的方式。
foreach(DictionaryEntry en in enineers.Keys)
{
	Console.WriteLine(en.Key);
	Console.WriteLine(((SE)en.Values).Name);
}

DictionaryEntry是一个结构,定义可设置或者检索的Hashtable的键/值对。

4:泛型
泛型是C#2.0中的一个新特性。泛型引入了一个概念,类型参数,通过类型参数(T),减少了运行时强制转换或装箱操作的风险,通过泛型可以最大限度的重用代码,保护类型的安全及提高性能,他最常见的应用就是创建集合类,可以约束集合类中的元素的类型。比较典型的泛型集合是List和Dictionary<K,V>。下面对这两种泛型进行详细说明。

5:泛型集合List
1:在System.Collections.Generic命名空间中定义了许多泛型集合类,这些类可以替代我们前边学习的ArrayList和Hashtable。

2:语法:List 对象名 = new List();
“”中的T可以对集合中的元素类型进行约束,T表明集合中管理的元素类型,对集合中的数据类型进行约束。

3:List和ArrayList的区别:
在这里插入图片描述6:泛型集合Dictionary<K,V>
1:在C#中还有一种泛型集合Dictionary<K,V>,它具有泛型的全部特性,编译时检查类型约束,获取元素时无需类型转换,并且它储存数据的方式和Hashtable类似,也是通过Key/Value(键/值)对元素保存的。

2:语法:Dictionary<K,V> 对象名 = new Dictionary<K,V>();
说明:Dictionary<K,V>中表示集合中Key的类型,V表示Value的类型,它们的含义和List是相同的。

3:Dictionary<K,V>和Hashtable的区别:
在这里插入图片描述4:遍历Dictionary<K,V>还可以采用以下方式:

foreach(KeyValuePair<string,SE> en in engineers)
{
	Console.WriteLine(en.Key);
	Console.WeiteLine(en.value.Name);
}

KeyValuePaiy<TKey,TValue>是一个泛型结构,定义可设置或者检索的键/值对。

7:泛型类
1:对于一些常常处理不同类型数据转换的类,可以使用泛型定义。定义泛型类的过程,与定义一个类相似,不同之处尖括号中定义了类型参数。

2:语法:

public class 类名<T>
{
	//…
}

T指类型参数,代表具体的数据类型,可以是类类型,也可以是基本数据类型。

8:泛型有以下优点:
1:性能高,普通集合的数据需要装箱,拆箱操作,而泛型无需类型转换的操作。

2:类型安全。泛型集合对它所存储的对象进行了类型约束,不是它所允许存储的类型是无法添加到泛型集合中的。

3:实现代码的重用。泛型相当于模板,由于它支持任意的数据类型,开发人员不必为每种特定的数据类型编写一套方法,所以它具有极大的可重用性。泛型编程是未来的主流技术=之一。

发布了88 篇原创文章 · 获赞 23 · 访问量 7433

猜你喜欢

转载自blog.csdn.net/S0001100/article/details/104092567