Visual C#2005——如何使用ToArray方法返回一个强类型数组

 

我们说明如何使用ArrayList对象的ToArray方法返回一个强类型数组之前,必须要简介一下ArrayArrayList之间的差异。

 

基本上,ArrayList是数组的复杂版本。ArrayList类拥有Collections类所提供的大部分功能,而这些功能则是Array类所付之阙如的。例如:

 

Ø        Array的容量是固定的,ArrayList的容量则会视需要自动扩充。如果 ArrayList.Capacity属性的值更改,记忆体重新分配与元素的复制会自动完成。

Ø        ArrayList提供用来添加、插入或移除特定范围之元素的方法。然而在Array 中,您一次只能够取得或设定一个元素的值。

Ø        您可以很容易使用ArrayListSynchronized方法来轻松创建ArrayList的同步化版本。相对来说,Array则是将它交给用户来实现同步处理。

Ø        ArrayList提供能够将只读与固定大小的包装函数返回给集合的方法。相对来说,Array则不提供。

Ø        当然,ArrayList并非万能,同样的,Array也并非一无是处。事实上,Array提供某些ArrayList没有的弹性。例如:

Ø        您可以设定Array的下限,但是ArrayList的下限则永远是零。

Ø        Array可以拥有多个维度,ArrayList则只能拥有一个维度。

Ø        特定类型(Object除外)的Array拥有优于ArrayList的性能,原因是ArrayList的元素类型为Object,因此如果存储或撷取值类型(Value Type)的话,BoxingUnboxing通常会因此而发生。

 

在大部分的情况中,对数组的调用可以使用ArrayList来代替,如此一来将会比较容易使用,而且通常能够产生类似Object类型数组的性能。

 

另外别忘了,Array位于System命名空间,ArrayList则位于System.Collections命名空间。

 

了解了ArrayArrayList的基本差异之后,我们要谈谈正题,那就是如何使用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());

}

 

章立民研究室敬上

 

 

期待更多精彩,敬请关注:

http://www.china-pub.com/static/jsj_zlm_060824.html

 

posted on 2006-09-26 14:13  章立民研究室  阅读(5087)  评论(10编辑  收藏  举报

导航