我们说明如何使用
ArrayList
对象的
ToArray
方法返回一个强类型数组之前,必须要简介一下
Array
与
ArrayList
之间的差异。
基本上,
ArrayList
是数组的复杂版本。
ArrayList
类拥有
Collections
类所提供的大部分功能,而这些功能则是
Array
类所付之阙如的。例如:
Ø
Array
的容量是固定的,
ArrayList
的容量则会视需要自动扩充。如果
ArrayList.Capacity
属性的值更改,记忆体重新分配与元素的复制会自动完成。
Ø
ArrayList
提供用来添加、插入或移除特定范围之元素的方法。然而在
Array
中,您一次只能够取得或设定一个元素的值。
Ø
您可以很容易使用
ArrayList
的
Synchronized
方法来轻松创建
ArrayList
的同步化版本。相对来说,
Array
则是将它交给用户来实现同步处理。
Ø
ArrayList
提供能够将只读与固定大小的包装函数返回给集合的方法。相对来说,
Array
则不提供。
Ø
当然,
ArrayList
并非万能,同样的,
Array
也并非一无是处。事实上,
Array
提供某些
ArrayList
所
没有的弹性。例如:
Ø
您可以设定
Array
的下限,但是
ArrayList
的下限则永远是零。
Ø
Array
可以拥有多个维度,
ArrayList
则只能拥有一个维度。
Ø
特定类型(
Object
除外
)的
Array
拥有
优于
ArrayList
的性能,原因是
ArrayList
的元素类型为
Object
,因此如果存储或撷取值类型(
Value Type
)的话,
Boxing
和
Unboxing
通常会因此而发生。
在大部分的情况中,对数组的调用可以使用
ArrayList
来代替,如此一来将会比较容易使用,而且通常能够产生类似
Object
类型数组的性能。
另外别忘了,
Array
位于
System
命名空间,
ArrayList
则位于
System.Collections
命名空间。
了解了
Array
与
ArrayList
的基本差异之后,我们要谈谈正题,那就是如何使用
ArrayList
对象的
ToArray
方法返回一个强类型数组。
如果您使用
ArrayList
类的
ToArray
方法时并未指定任何参数,则无参数的
ToArray
方法将会返回一个类型为
Object
的数组,而且您不可以将此一
Object
数组转换成您所需的类型的数组。例如,假设您将一个
Customer
对象加入至一个
ArrayList
中,则其源列表将不会被制作成一个
Customer
数组。此举将使得以下的语句会执行失败并返回一个
System.InvalidCastException
异常:
Customer[] custArray = (Customer[]) myArrayList.ToArray();
要想返回一个强类型数组,请使用
ToArray
方法的另外一个重载版本,也就是会接收一个对象类型作为其参数的重载版本。比方说,如果将之前的转换语句改写如下,将能够成功执行:
Customer[] custArray =
(Customer[]) myArrayList.ToArray(typeof(Customer));
但是请注意,上述的转换必须在
ArrayList
的所有元素都是相同类型的时候才会成功。如果您尝试使用
ToArray
方法将一个含有不同类型对象的
ArrayList
转换成特定的类型,将会失败。
以下的程序代码将我们以上的说明作更完整的示范:
public class Customer
{
public string cName;
}
private void btnToArray_Click(object sender, EventArgs e)
{
Customer c = new Customer();
c.cName = "
章立民";
ArrayList al = new ArrayList();
al.Add(c);
Object cArray = al.ToArray();
//
显
示 ArrayList 的
类
型。
MessageBox.Show(cArray.GetType().ToString());
//
如果
这样写将会
引
发异
常 InvalidCastException。
// Customer[] custArray = (Customer[])(al.ToArray());
//
必
须
使用 ToArray(Type)
这
一
个
重
载
版本才可以。
Customer[] custArray = (Customer[])(
al.ToArray(typeof(Customer)));
MessageBox.Show(custArray.GetType().ToString());
}
章立民研究室敬上
本文出自 “章立民” 博客,转载请与作者联系!