2 つの構文の違いは何ですか?
3 に答える
1 つ目は多次元配列で、2 つ目はジャグ配列です。この質問を見て、2つの違いの説明を得ることができますが、ここに重要なスニピットがあります:
多次元配列は優れたリニア メモリ レイアウトを作成しますが、ジャグ配列はいくつかの余分なレベルの間接性を意味します。
ジャグ配列 var jagged = new int[10][5] で値 jagged[3][6] を検索すると、次のように動作します: インデックス 3 (配列) の要素を検索し、インデックスの要素を検索します。その配列の 6 (これは値です)。この場合、次元ごとに追加のルックアップがあります (これは、コストのかかるメモリ アクセス パターンです)。
多次元配列はメモリ内に線形に配置され、実際の値はインデックスを乗算することによって求められます。ただし、配列 var mult = new int[10,30] を指定すると、その多次元配列の Length プロパティは要素の総数、つまり 10 * 30 = 300 を返します。
ジャグ配列の Rank プロパティは常に 1 ですが、多次元配列は任意のランクを持つことができます。任意の配列の GetLength メソッドを使用して、各次元の長さを取得できます。この例の多次元配列では、mult.GetLength(1) は 30 を返します。
多次元配列にインデックスを付ける方が高速です。たとえば、この例の多次元配列が mult[1,7] = 30 * 1 + 7 = 37 の場合、そのインデックス 37 で要素を取得します。これは配列のベースアドレスです。
したがって、多次元配列は連続したメモリ ブロックを割り当てますが、ジャグ配列は正方形である必要はありません。例: jagged 1 .Length は jagged[2].Length と等しい必要はありません。これは多次元配列に当てはまります。
アップデート:
マルチ配列とジャグ配列の主な違いの 1 つは、マルチ配列は常に「正方形」でなければならないことです。つまり、2 つのインデックスの子配列の要素数は同じになります。ジャグ配列には、この要件はありません。以下のコードを見てください。
var jagged = new int[3][]; //not defining the size of the child array...
var multi = new int[3,8]; //defining a 3x8 "square"
var multiBad = new int[3,]; //Syntax error!
var jaggedSquare= new int[3][8]; //another 3x8 "square"
前者は 2 次元配列です。後者は、要素も配列である配列です。
最初は多次元配列用です
2番目は配列の配列用です