はじめに
C#を扱っていると、多次元配列の宣言方法に戸惑うことがある。「new
を書くべきか、それとも省略できるのか?」と疑問に思ったことはないだろうか。
筆者も最初の頃は、どちらの書き方が正しいのか曖昧なままコードを書いていた。今回は、自身の経験をもとにこの疑問を整理してみる。
多次元配列の宣言方法とnewの省略可否
C#では、多次元配列を宣言する際にnew データ型[,]
を使うことが多い。しかし、これは必ずしも必要ではない。結論から言うと、配列のリテラル(初期化子)を使う場合はnew
を省略できるが、そうでない場合は必須だ。
まず、具体例を見てみよう。
1. new を省略できるケース
配列の宣言と初期化を同時に行う場合、new
を書かなくてもコンパイルが通る。
int[,] array = { { 1, 2, 3 }, { 4, 5, 6 } };
このように、直接 {}
で値を並べると、C#のコンパイラが自動的に配列のサイズを推測し、適切な配列を生成する。そのため、new int[,]
を省略しても問題ない。
2. new を省略できないケース
逆に、宣言と初期化を別々に行う場合は、new
が必須になる。
int[,] array;
array = { { 1, 2, 3 }, { 4, 5, 6 } }; // コンパイルエラー
このコードはエラーになる。なぜなら、C#の仕様上、配列の初期化リテラル({}
)は、宣言時にしか使えないためだ。
もし、このように別の行で初期化したいなら、new
を明示する必要がある。
int[,] array;
array = new int[,] { { 1, 2, 3 }, { 4, 5, 6 } }; // OK
また、配列のサイズだけを指定し、後で値を代入する場合もnew
が必須。
int[,] array = new int[2, 3]; // { { 0, 0, 0 }, { 0, 0, 0 } } (デフォルト値)
このように、サイズだけを指定した場合、中身はデフォルト値(整数なら0
)で埋められる。
3. var を使って簡潔に書く
C#には型推論(var
)があるため、多次元配列の型を明示せずに書くことも可能だ。
var array = new[,] { { 1, 2, 3 }, { 4, 5, 6 } }; // 型推論により int[,] と判断される
このように書くと、new int[,]
の部分が new[,]
になり、型を省略できる。
C#の型推論は非常に強力で、配列の要素から自動的に型を推測してくれる。
まとめ
new データ型[,]
は 省略可能 → 宣言と初期化を同時に行う場合new データ型[,]
は 必須 → 宣言と初期化を分ける場合 or サイズだけ指定する場合var
を使えば 型を省略して書くことも可能
最初は「new
っていらないの?」と疑問に思っていたが、規則が分かるとスッキリする。
コードを書く際には、どのパターンに該当するのかを意識すると、エラーを未然に防げるはずだ。
参考リンク
- Microsoft公式:C# 配列のドキュメント
- Microsoft公式:暗黙的に型指定された配列(var)の使い方
- C# 言語仕様(ECMA-334)配列初期化に関する記述
- Stack Overflow: “Why do I need ‘new’ when assigning a multi-dimensional array?”
- C# コーディングスタイルと型推論のベストプラクティス(JetBrains公式)
コメント