数组数组(锯齿状数组)比多维数组更快,并且可以更有效地使用。多维数组具有更好的语法。
如果您使用锯齿形和多维数组编写一些简单的代码,然后使用IL反汇编程序检查编译后的程序集,您会发现从锯齿形(或一维)数组进行存储和检索是简单的IL指令,而多维数组的相同操作是方法调用总是比较慢。
请考虑以下方法:
static void SetElementAt(int[][] array, int i, int j, int value)
{
array[i][j] = value;
}
static void SetElementAt(int[,] array, int i, int j, int value)
{
array[i, j] = value;
}
他们的IL如下:
.method private hidebysig static void SetElementAt(int32[][] 'array',
int32 i,
int32 j,
int32 'value') cil managed
{
// Code size 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldarg.1
IL_0002: ldelem.ref
IL_0003: ldarg.2
IL_0004: ldarg.3
IL_0005: stelem.i4
IL_0006: ret
} // end of method Program::SetElementAt
.method private hidebysig static void SetElementAt(int32[0...,0...] 'array',
int32 i,
int32 j,
int32 'value') cil managed
{
// Code size 10 (0xa)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldarg.1
IL_0002: ldarg.2
IL_0003: ldarg.3
IL_0004: call instance void int32[0...,0...]::Set(int32,
int32,
int32)
IL_0009: ret
} // end of method Program::SetElementAt
使用锯齿状数组时,您可以轻松执行诸如行交换和行调整大小之类的操作。也许在某些情况下使用多维数组会更安全,但是即使Microsoft FxCop告诉您,在使用锯齿状数组分析项目时也应使用锯齿状数组,而不是多维数组。