第三部分 基本类型:第16章 数组
派生关系:
System.Object => System.Array => 数组
数组是引用类型,是在托管堆上进行分配的。
Int32[] myIntegers; //声明了一个数组引用,初始设置为null myIntegers = new Int32[100]; //创建了含有100个Int32的数组,初始化为0。该数组的内存块地址被返回并保存到myIntegers变量中
创建引用类型数组:
Control[] myControls; //声明一个数组引用 myControls = new Control[150]; //创建含有50个Control引用的数组,分配含有50个Control引用的一个数组,这些引用全部被初始化为null。
创建多维数组:
//创建二维数组,由Double值构成 Double[,] myDoubles = new Double[10,20]; //创建三维数组,由String引用构成 String[,,] myStrings = new String[5,3,10];
CLR支持交错数组(jagged array),即由数组构成的数组。
如何创建多边形数组,每个多边形由一个Point实例数组构成:
//创建含有Point数组的一维数组 Point[][] myPolygons = new Point[3][]; //myPolygons[0]引用一个含有10个Point实例的数组 myPloygons[0] = new Point[10]; //myPolygons[1]引用一个含有20个Point实例的数组 myPolygons[1] = new Point[20]; //myPloygons[2]引用一个含有30个Point实例的数组 myPloygons[2] = new Point[30]; //显示第一个多边形中的Point for(Int32 x=0;x < myPloygons[0].Length; x++) { Console.WriteLine(myPloygons[0][x]); }
16.1 初始化数组元素
String[] name = new String[]{"Aidan","Grant"}; //大括号中以逗号分隔的数据项称为数组初始化器,每个数据项都可以是一个任意复杂度的表达式。
语法糖简写:
String[] names ={"Aidan","Grant"};
但不允许写成:
var names ={"Aidan","Grant"}; //需要编译器做的太多了,所以报错
可利用C#的隐式类型的数组功能让编译器推断数组元素的类型:
下面代码没有在new和[]之间指定类型:
var names = new[]{"Aidan","Grant",null}; //null可转型为任意引用类型(包括String),所以推断为String类型
//使用C#的隐式类型的局部变量和隐式类型的数组功能:(错误)
var names = new[] {"Adia","Grant",123}; //报错:找不到隐式类型数组的最佳类型,因为string和int32共同基类是Object,所以不得不创建Object引用的数组,然后对123进行装箱。C#团队认为装箱代价高昂,所以编译报错。
“隐式类型的数组”如何与“匿名类型”和“隐式类型的局部变量”组合使用:
//使用C#的隐式类型的局部变量、隐式类型的数组和匿名类型功能: var kids = new[]{new {Name="Aian"},new {Name="Crant"}};
//示例用法(用了另一个隐式类型的局部变量): foreach(var kid in kids){ Console.WriteLine(kid.Name); }