Visual C#2005——如何使用ToArray方法返回一个强类型数组
2006-09-26 14:13
1046 查看
我们说明如何使用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());
}
[align=left]章立民研究室敬上[/align]
基本上,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());
}
[align=left]章立民研究室敬上[/align]
相关文章推荐
- Visual C#2005——如何使用ToArray方法返回一个强类型数组
- Visual C#2005——如何使用ToArray方法返回一个强类型数组
- ToArray(type) 方法返回强类型数组
- 返回多个不同类型参数的值(out)可变参数一维数组( params )把值从方法中带出(ref) 方法递归(方法自己调用自己与循坏类似注意return每次只能跳出一个方法))
- 使用泛型, 写一个为任意类型的动态数组添加元素的方法
- 用类名做方法的返回值类型 在学习Java的初始阶段,很多同学使用基本数据类型定义变量和引用类型定义变量以及使用类名做方法的返回值类型常常不知所以。今天我以自己的解读方式和个人的理解作一个简单的解释,和
- 如何使用软件的方法来查找一个QML的类型的所有的property
- Java里如何实现一个方法在不同情况下“返回”不同的类型变量?
- C Primer plus 10.2 初始化一个double类型的数组,然后把该数组的内容拷贝至3个其它的数组中,使用带数组的表示方法的函数进行第一份拷贝,使用带指针表示方法和指针递增的函..
- 单元测试时候使用[ClassInitialize]会该方法必须是静态的公共方法,不返回值并且应采用一个TestContext类型的参数报错的解决办法
- 11_5_3给people添加GetOldest()方法,使用上面定义的重载运算符,返回一个Age最大的对象数组
- 在主函数中提示用户输入用户名和密码。另写一方法来判断用户输入是否正确。该方法分别返回一个bool类型的登录结果和和一个string类型的登录信息。如登录成功,返回true及“登录成功”,若登录失败则返回false及“用户名错误”或“密码错误”(使用out参数)
- 在一个有返回值的方法里使用了子线程,如何返回子线程中的值,如下代码中,我在子线程获取到了address的值,但是这个方法的返回结果是空,该如何解决?
- 如何使用指针从函数返回一个数组。
- 如何使一个函数或方法同时返回多个不同类型的值
- [VB.NET]问下 :自己写的com,其中一个接口方法返回一个variant类型的值,在.net中如何接收啊
- 【Java面试题】17 如何把一个逗号分隔的字符串转换为数组? 关于String类中split方法的使用,超级详细!!!
- 使用ADO.NET类及方法实现数据库的查询并返回一个Object 数组
- 对于返回void类型的asyc的异步方法,如何修改,能使用await
- 【Unity&对象数组】如何创建一个长度不确定的对象数组以及使用方法&墙壁单元方块对象数组