Welcome

首页 / 软件开发 / .NET编程技术 / CLR笔记:13.数组

CLR笔记:13.数组2011-10-26 博客园 包建强CLR支持一维/多维/交错数组。

两种声明方式:

Array a;a = new String[0, 1];String[] s = new String[5];
注意,声明不要给与数组长度,因为此时还不分配内存;new时要指定长度。

将数组声明为Array和像String[]这样带中括号的,效果是一样的,只是前者更灵活,当然类型不安全 ,可能会有运行期错误。

所有数组都隐式派生于System.Array,后者派生自System.Object,所以数组是引用类型。

值类型的数组,new时,会创建实际的对象,所有元素都初始化为0;

引用类型的数组,new时,只是创建引用,不会创建实际的对象。

CLS要求数组必须是0基数组。

每个数组都关联了一些额外的信息,称为开销信息(Overhead)。

JITer只在执行一次循环之前检查一次数组边界,而不是每次循环都这么做。

13.1 数组的类型转换

对于引用类型的数组,两个数组类型必须维数相同,并且从源元素类型到目标元素类型,必须存在一 个隐式(向父类转)或显示(向子类转)的类型转换。

对于值类型的数组,不能将其转换为其他任何一种类型——使用Array.Copy方法替代:

            Int32[] ildim = new Int32[5];            Object[] obldim = new Object[ildim.Length];            Array.Copy(ildim, obldim, ildim.Length);
Array.Copy还可以再复制每个数组元素时进行必要的类型转换:

*将值类型的元素装箱为引用类型的元素

*将引用类型的元素拆箱为值类型的元素

*加宽CLR基元值类型,Int32到Double

*如果两个数组的类型不兼容(从Object[]转型为IFormattable[]),就对元素进行向下类型转换。

数组的协变性:将数组从一种类型转换为另一种类型,——会有性能损失,如下代码,会在运行期报 错:

String[] sa = new String[100];Object[] oa = sa;oa[5] = "Jax";oa[3] = 1;  //运行期错误
如果只是需要将数组中的某些元素复制到另一个数组,可以使用System.Buffer的BlockCopy()方法, 执行速度比Array.Copy快,但是只支持基元类型,不具有转型能力。