C# における多次元配列 "[,]" と配列の配列 "[][]" の違いは何ですか? 質問する

C# における多次元配列

C# における多次元配列double[,]と配列の配列の違いは何ですか?double[][]

違いがあるとしたら、
それぞれどのような用途が最適ですか?

ベストアンサー1

配列の配列 (ギザギザ配列) は多次元配列よりも高速で、より効果的に使用できます。多次元配列の構文は優れています。

ギザギザの多次元配列を使用して簡単なコードを記述し、コンパイルされたアセンブリを IL 逆アセンブラーで検査すると、ギザギザの (または 1 次元の) 配列の保存と取得は簡単な 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 でも、プロジェクトの分析に使用する場合は多次元配列ではなくギザギザの配列を使用する必要があると示されています。

おすすめ記事