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());
}
 
章立民研究室敬上

本文出自 “章立民” 博客,转载请与作者联系!

你可能感兴趣的:(C#,数组,toArray,休闲,Visual)