using System;
namespace MyArray
{
//System.Object--->System.Array-->类型[] 由 CLR自动创建 类型[]
//为了符合CLS的要求,所有数组都必须是0基数组(即最小索引为0)
//如有可能,应该坚持使用一维0基数组,因为可以使用特殊的IL指令(newarr,ldelem,ldelema,ldlen和stelem)来处理它们,
//而且这些特殊的IL指令会导致JIT编译器生成优化的代码,性能是最佳的。
//访问数组元素需要利用索引(index)。
//数组元素的类型叫做数组的类型。
//值类型数组(自动清0)、引用类型数组(自动清null)。
//C#中的数组存在越界检查,同时类型的溢出也会被检查。但在编译时间不检查,而是在运行时检查。
//new:
// 除了数组元素,数组对象所占有的内存块还包含一个类型指针、一个同步索引块,
// 保存在该数据的内存快的开销部分(overhead);
// 一些额外的参数信息(数组的元素类型、数组的维数、数组每一维的最低下限<默认为0>和每一维的长度),
// 保存在该数据的内存块的开销部分(overhead);
// 返回数组的内存块地址。
//不规则数组是由数组构成的数组。规则数组的空间是连续的,不规则数组的空间是不连续的。
//返回数组参数的方法:如果该数组中不含有任何元素,Microsoft强烈建议您让它返回一个零长度的数组,
//而不是返回一个空引用null,因为这样做能简化开发人员在调用该方法时需要编写的代码
//同样如果类中的成员变量是一个数组引用,就应该让该成员始终引用数组,即使数组中不含有任何元素。
class MyArray
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
//引用类型数组的类型转换
//指向同一引用数组
//数组类型变量的类型如果是数组元素类型的同类或者是基类,就可以进行隐式或显示转换
string[] sa = new string[100];
object[] oa = sa;
oa[0] = "student";
oa[1] = 5;//编译通过,因为等号右面的类型是左面的类型的同类或者是派生类
//运行出错,因为运行时(CLR)检查到数组元素的类型为string类型,而实例的类型为int类型。
// 所有数组都隐式继承自System.Array
string[] sArray;
//由 CLR自动创建一个string[]类型,将隐式继承自System.Array,而不时有C#生成IL代码
Array a;
a = new String[3];
// a[0] = "student";
}
}
}