C# 非泛型集合基础:ArrayList与Hashtable的使用与注意事项
在C#中,ArrayList
和 Hashtable
是两个非泛型的集合类,它们在.NET Framework的早期版本中广泛使用,但在现代C#开发中,由于泛型集合(如 List<T>
和 Dictionary<TKey, TValue>
)提供了更好的类型安全性和性能,因此非泛型集合的使用已经逐渐减少。不过,了解它们的基本用法仍然是有益的,特别是在维护旧代码或进行特定类型的操作时。
ArrayList
ArrayList
是一个可以动态调整大小的数组,用于存储任意类型的对象。不过,由于它不提供类型安全,所以在添加或检索元素时需要进行类型转换。
示例:使用ArrayList
using System;
using System.Collections;class Program
{static void Main(){ArrayList myAL = new ArrayList();// 添加元素myAL.Add("Hello");myAL.Add(1);myAL.Add(true);// 访问元素(需要类型转换)string item1 = (string)myAL[0];int item2 = (int)myAL[1];bool item3 = (bool)myAL[2];Console.WriteLine(item1);Console.WriteLine(item2);Console.WriteLine(item3);// 遍历ArrayListforeach (object item in myAL){Console.WriteLine(item);}}
}
Hashtable
Hashtable
是一个存储键值对的集合,类似于字典,但它不是泛型的。与 ArrayList
类似,Hashtable
也提供了动态数组的功能,但它允许你通过键(而不是索引)来访问集合中的元素。由于 Hashtable
不是泛型的,所以键和值都是 object
类型,这同样要求你在使用时进行类型转换。
示例:使用Hashtable
using System;
using System.Collections;class Program
{static void Main(){Hashtable myHT = new Hashtable();// 添加键值对myHT.Add("key1", "value1");myHT.Add("key2", 2);// 访问元素(需要类型转换)string value1 = (string)myHT["key1"];int value2 = (int)myHT["key2"];Console.WriteLine(value1);Console.WriteLine(value2);// 遍历Hashtableforeach (DictionaryEntry de in myHT){Console.WriteLine($"Key = {de.Key}, Value = {de.Value}");}}
}
注意事项
- 由于
ArrayList
和Hashtable
不提供类型安全,所以在添加或检索元素时需要进行显式类型转换,这可能会引发InvalidCastException
。 - 泛型集合(如
List<T>
和Dictionary<TKey, TValue>
)提供了更好的类型安全性和性能,因此在可能的情况下应优先使用它们。 - 在处理大型数据集或需要高性能的场景中,泛型集合通常比非泛型集合表现更好。