其中定义了int[]和string[]类

本文关键字:string int 定义 | 更新日期: 2023-09-27 18:04:41

int a = 0;
int[] b = new int[3];
Console.WriteLine( a.GetType() );
Console.WriteLine( b.GetType() );

a的类型是System.Int32,它是一个结构体。b的类型为int[]

可以看到Visual Studio中Int32的定义。int[]的定义在哪里?

其中定义了int[]和string[]类

对于给定的类型T,类型T[]是通过组合预定义的。T[][]等也是。

系统。数组

Array类是支持数组的语言实现的基类。但是,只有系统和编译器可以显式地从Array类派生。用户应该使用语言提供的数组结构。

更详细:

从。net Framework 2.0开始,Array类实现了System.Collections.Generic。那么,System.Collections.Generic。和System.Collections.Generic.IEnumerable泛型接口。实现在运行时提供给数组,因此对文档构建工具不可见。因此,泛型接口不会出现在Array类的声明语法中,并且只有通过将数组强制转换为泛型接口类型(显式接口实现)才能访问的接口成员没有引用主题。当将数组强制转换为这些接口之一时,需要注意的关键是添加、插入或删除元素的成员会抛出NotSupportedException。

c#:

static void Main(string[] args)
        {
            int a = 0;
            int[] b = new int[3];
        }

IL:

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  //        11 (0xb)
  .maxstack  1
  .locals init ([0] int32 a,
           [1] int32[] b)
  IL_0000:  nop
  IL_0001:  ldc.i4.0
  IL_0002:  stloc.0
  IL_0003:  ldc.i4.3
  IL_0004:  **newarr**     [mscorlib]System.Int32
  IL_0009:  stloc.1
  IL_000a:  ret
}

可以看到"newarr"这里是关于newarr的细节http://www.dotnetperls.com/newarr

新的指令不是很有趣。但它确实暴露了。net框架的一个重要设计决策。向量(1D数组)与2D数组是分开的。这些知识可以影响您在程序中选择的类型。