数组
1,所有数组都隐式派生自System.Array
2,所有数组都隐式实现IEnumerable,ICollecation,IList
①创建一个0基数组类型时,CLR自动是数组类型实现IEnumberable<T>,ICollection<T>,IList<T>。同时,还为数组类型的所有基类型实现这三个接口。以下层次结构图对此进行了澄清
Object
Array(非泛型IEnumberable,ICollection,IList)
Object[](IEnumberable,ICollection,IList of Object)
Stream[](IEnumberable,ICollection,IList of Stream)
FileStream[](IEnumberable,ICollection,IList of FileStream)
②如果数组包含值类型的元素,数组类型不会为元素的基类型实现接口(DateTime[] dtArray)
3,创建下限非零的数组
static void Main(string[] args) { //下届非0的二维数组 int[] lowerBounds = {2015, 1};//下界 int[] lengths = {5, 4};//它包含要创建的 System.Array 的每个维度的大小 var d = (decimal[,]) Array.CreateInstance(typeof (decimal), lengths, lowerBounds); Console.WriteLine(d.GetLowerBound(0));//1维第一个元素的索引。输出2015 Console.WriteLine(d.GetUpperBound(0));//1维最后一个元素的索引。输出2019 Console.WriteLine(d.GetLowerBound(1));//2维第一个元素的索引。输出1 Console.WriteLine(d.GetUpperBound(1));//2维最后一个元素的索引。输出4 Console.ReadKey(); }
4,CLR内部实际支持两种不同的数组
①下限为0的一维数组。这些数组有时称为SZ(一维0基)数组或向量
②下限未知的一维或多维数组
static void Main(string[] args) { Array a; //创建一维0基数组,不包含任何元素 a = new string[0]; Console.WriteLine(a.GetType());//System.String[] //创建一维0基数组,不包含任何元素 a = Array.CreateInstance(typeof (String), new int[] {0}, new int[] {0}); Console.WriteLine(a.GetType());//System.String[] //创建一维1基数组,不包含任何元素 a = Array.CreateInstance(typeof(String), new int[] { 0 }, new int[] { 1 }); Console.WriteLine(a.GetType());//System.String[*] *符号表明CLR知道该数组不是0基的 //创建二维0基数组,不包含任何元素 a = new string[0,0]; Console.WriteLine(a.GetType());//System.String[,] //创建二维0基数组,不包含任何元素 a = Array.CreateInstance(typeof(String), new int[] { 0,0 }, new int[] { 0,0 }); Console.WriteLine(a.GetType());//System.String[,] //创建二维1基数组,不包含任何元素 a = Array.CreateInstance(typeof(String), new int[] { 0,0 }, new int[] { 1,1 }); Console.WriteLine(a.GetType());//System.String[,] Console.ReadKey(); }
在运行时,CLR将所有的多维数组都视为非0基数组
访问一维0基数组的元素比访问非0基一维或多维数组的元素稍快
学习永不止境,技术成就梦想。