この章のテーマ §
配列の初期化構文を学習します。複数の要素にまとめて値をセットできます。
前提知識 §
Console.WriteLineメソッド, 文字列の基礎, 変数の基礎, 配列の基礎, 条件演算子, int型, for文, foreach文,
解説 §
配列は作成されると通常、0または0に対応する値またはnull参照で初期化されます。
しかし、特定の値が入った状態で配列を作成したい場合もあります。
その場合は、値を列挙して配列を作成します。
やり方は複数あります。
サンプルソースのCASE1のやり方は、new int[] { 2, 3, 5 };のようにnew演算子の後ろに波括弧で囲って初期値を列挙する方法です。この場合、確保する配列の要素数を省略できます。列挙された初期値の数から配列の大きさが分かるからです。
サンプルソースのCASE2のやり方は、new演算子を省略してint[] array2 = { 2, 3, 5 };のように初期化する値として初期値のリストを付けてしまう方法です。この方法は短く書けて便利ですが、配列を変数として確保するばあいにしか使えません。varで変数を宣言する場合にも使えません。初期化リストだけでは配列の型が決まらないためです。
サンプルソースのCASE3のやり方は、多次元配列を初期化する場合です。多次元配列でも初期化構文は使用できます。
罠の数々 §
- この機能は便利だが、要素数が増えるとすぐ破綻する。5個や10個ぐらいの値を列挙するのなら良いが、100個、1000個、それ以上になると、ソースコードには書き切れない。初期化構文は使用せず、ファイルなどから読み込むように作成する方が楽かも知れない
- 列挙する値は、その型である必要はない。たとえば、object[]の配列をstring型の値を列挙して初期化しても問題はない (逆にいえば、列挙された値から型は決められない)
参考リンク §
配列 (C# プログラミング ガイド)
サンプルソース: arrayInitializer §
Console.WriteLine("CASE1");
int[] array1 = new int[] { 2, 3, 5 };
foreach (var item in array1) Console.Write($"{item} ");
Console.WriteLine();
Console.WriteLine("CASE2");
int[] array2 = { 2, 3, 5 };
foreach (var item in array2) Console.Write($"{item} ");
Console.WriteLine();
Console.WriteLine("CASE3");
int[,] array3 = { { 2, 3, 5 }, { 7, 11, 13 } };
for (int i = 0; i < array3.GetLength(0); i++)
{
for (int j = 0; j < array3.GetLength(1); j++)
{
Console.Write($"{array3[i,j]} ");
}
Console.WriteLine();
}
実行結果 §
CASE1
2 3 5
CASE2
2 3 5
CASE3
2 3 5
7 11 13
リポジトリ §
https://github.com/autumn009/CSharpPrimer2
練習問題 §
値を何も指定しない場合、int型の配列の要素は0で初期化されるが参照型の配列の要素はnullで初期化される。
以下の場合、0とnullのどちらで初期化されるだろうか。
以下のプログラムの実行結果を予測してみよう。(選択肢にはTrueとFalseの部分のみ列挙)
int?[] a = new int? [1];
Console.WriteLine($"a[0] == null: {a[0] == null}");
Console.WriteLine($"a[0] == 0: {a[0] == 0}");
- False False
- True False
- False True
- True True
- 実行時に例外が起きる
[[解答]]