Visual C#2005——如何使用ToArray方法返回一个强类型数组
我们说明如何使用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());
}