每個內層的 一維數組可以有同不的大小。在需要不同大小的數組時可以使用鋸齒數據。使用 鋸齒數組的缺點是在列方面上的訪問是底效的。檢查一個每行上有三個列的鋸齒 數組時,每次訪問都要做兩個檢測 。在行0列3上的元素和在行1列3的元素沒有 任何關系。只有多維數組才可在以列方面上的訪問有一定的效率。過去,C和C++ 程序使用二維或多維數組時是把它們映射到一個一維數組上。對於老式的C和C++ 程序員,這樣的標記應該很清楚:
double num = MyArray[ i * rowLength + j ];
這個世界上的其它人可能更喜歡這樣:
double num = MyArray[ i, j ];
但,C和C++其實 並不支持多維數組。C#可以,而且對於多維數組的語法:當你創建一個真實的多 維數組時,對於編譯器和你來說意義都是很清楚的。創建多維數組時只用在熟悉 的一維數組標記上擴展一下就行了:
private int[ , ] _multi = new int[ 10, 10 ];
前面的申明創建了一個二維數組,而且是 10X10的100個元素。在多維數組上的每一維的長度總是一致的。編譯器利用這一 特性,可以創建更高效的代碼。初始化鋸齒數組時須要多次使用初始語句。而在 我前面的例子裡(譯注:指這裡:private int[] [] _jagged;),你須要5個語句 。更大的數組或者更多維的數組須要更多的初始代碼,而且你要手動編寫。然而 ,多維數組在初始化時只要指定多少維就行了。此外,多維數組在初始化元素時 更有效。以於值類型數組在初始化時是直接在有效的數組索引上包含該值,所有 的內容就是0。而引用類型的數組則是null。數組的數組在內層上都包含null引 用。
訪問多維數組時比訪問鋸齒數組要快得多,特殊是在列或者對角線 上訪問時。編譯器在數組的每個維上是使用的指針算法。鋸齒數組則要為每個一 維數組查找正確的(指針引用)值。
多維數組可以當成數組在很多情況下 使用。假設你創建一個棋盤游戲,你可能須要在一個格子上創建一個64個方格的 棋盤:
private Square[ , ] _theBoard = new Square[ 8, 8 ];
這個初始化創建了數組來存儲方格,假設這些方格是引用類型 ,這些方格自己還沒有創建,而且每個元素還是null。為了初始化每個元素,你 還要檢測數組上的每一維元素:
for ( int i = 0; i < _theBoard.GetLength( 0 ); i++ )
for( int j = 0; j < _theBoard.GetLength( 1 ); j++ )
_theBoard[ i, j ] = new Square( );
你你還有更靈活的方法來訪問多維數組,你可以給定 個別的元素索引來訪問該元素:
Square sq = _theBoard[ 4, 4 ];
如果你要迭代整個集合,你還可以使用迭代器:
foreach( Square sq in _theBoard )
sq.PaintSquare( );
與鋸齒數組相比,你可能要這樣寫:
foreach( Square[] row in _theBoard )
foreach( Square sq in row )
sq.PaintSquare( );