Array.Copy的笔记:
1、将值类型的元素装箱位引用类型的元素,比如讲一个Int32[]的元素复制到Object[]中
2、将引用类型的元素拆箱为值类型的元素
3、加宽CLR基元值类型,比如讲一个Int32[]的元素复制到一个Double[]中。
4、在两个数组之间复制是,如果仅从数组类型证明不了两者的兼容性,比如从Object[]转型为IFormattable[],根据需要对元素进行向下类型转换。如果Object[]中的每一个对象都实现了IFormattable,Copy方法就能成功执行。
如果只是需要把数组中的某些元素复制到另一个数组,可以选择System.Buffer的BlockCopy方法,它的执行速度比Array的Copy方法快。
所有数组都隐式派生自System.Array。
所有数组痘印是实现IEnumerable,Icollection和IList:因为这些接口将所有元素都视为System.Object,然而,最好是让System.Array都实现这些接口的泛型形式,提供更好的编译时类型安全性和更好的性能。
不过,因为涉及多维数组和非0基数组的问题,CLR团队不希望System.Array实现IEnumerable<T>,ICollection<T>和IList<T>。同时还会维数组类型的所有基类型实现这三个接口,只要他们是引用类型。一下层次结构图对此进行了澄清:
Object Array Object[] Stream[] FileStream[]
所以,如果你执行以下代码:
FileStream[]fsArray
CLR创建FileStream[]类型时,会自动为这个类型实现IEnumerable<Stream>,IEnumerable<Object>,ICollection<Object>,IList<Stream>和IList<Object>。
时间: 2024-11-19 21:18:15