前回は、new int[10]のように要素数を指定して配列を生成し、そのあとでインデックスを指定して1つずつ値を設定しました。今回は、配列を生成するのと同時に、最初から値を入れておく書き方を見ていきます。
図1 今回のテーマ「生成と同時に値を設定する」
テスト用のボタンを追加する
まず、前回作成した「配列の生成」ボタンの下に、新しくボタンを1つ追加します。ボタンのTextは「生成と同時に値を設定する」としておきます。
図2 フォームにボタンを追加する
追加したボタンをダブルクリックすると、クリックイベントのメソッドbutton2_Clickが自動生成されます。今回のコードは、このメソッドの中に書いていきます。何をしている箇所なのかが後からわかるように、先頭にコメントを入れておきます。
リスト1 button2_Clickにコメントを入れる
private void button2_Click(object sender, EventArgs e)
{
//生成と同時に値を設定する
}
図3 自動生成されたbutton2_Clickにコメントを書いたところ
前回の書き方をおさらいする
比較のために、前回の書き方をもう一度書いておきます。型のあとに角括弧を付けたint[]が「intの配列」という型で、右辺のnew int[10]で要素数10の配列を生成しているのでした。
リスト2 前回の書き方(要素数を指定して生成)
//生成と同時に値を設定する int[] haiA = new int[10];
図4 前回と同じ書き方でhaiAを生成する
この書き方では、配列の入れ物が10個用意されるだけで、値はあとからhaiA[0] = 11;のように1つずつ設定する必要があります。
中括弧で値を並べて生成する
値を設定しながら生成する場合も、途中までは同じです。int[] haiB = new int[まで書いたら、前回は配列の数を設定していた角括弧の中を、何も書かずに閉じます。
図5 角括弧の中に要素数を書かずに閉じる
そして、その後ろに中括弧を付けて、カンマ区切りで値を並べます。
リスト3 生成と同時に値を設定する
int[] haiA = new int[10];
int[] haiB = new int[] { 11, 22, 33, 44 };
図6 中括弧の中にカンマ区切りで値を並べる
ここでは値を4個書いたので、配列としては要素数4で生成されます。要素数は書いた値の数から自動的に決まるため、角括弧の中に数を書く必要がありません。そして値は書いたとおり、11、22、33、44が最初から入った状態で配列が生成されます。
実行して確かめてみましょう。メソッドの終わりにブレークポイントを置いて実行し、「生成と同時に値を設定する」ボタンをクリックします。止まったところでhaiBにマウスカーソルを合わせると、データヒントに{int[4]}と表示され、展開するとインデックス0から3まで、指定したとおりの値が入っていることが確認できます。
図7 haiBは要素数4で、指定した値が最初から入っている
前回の書き方で同じ状態を作ろうとすると、次のように生成と値の設定を別々に書くことになります。リスト3のhaiBの1行は、これと同じ結果になります。
リスト4 同じ状態を前回の書き方で作った場合(比較用)
int[] haiB = new int[4]; haiB[0] = 11; haiB[1] = 22; haiB[2] = 33; haiB[3] = 44;
左辺をvarにする
ほかの書き方として、左辺をvarにすることもできます。右辺にnew int[]と書いてあるので、コンパイラはhaiCの型がint[]であると推論できます。
リスト5 左辺をvarにする
int[] haiB = new int[] { 11, 22, 33, 44 };
var haiC = new int[] { 11, 22, 33, 44 };
図8 左辺をvarにしたhaiC
これで実行しても、haiBと同じ結果になります。haiCの型はint[]で、要素数は4、値は11、22、33、44です。
右辺の型を省略する
逆に、右辺の型を消すこともできます。haiBの行をコピーして見比べてみると、new int[]の部分の文字が薄く表示されています。これは、Visual Studioが「この部分は省略できますよ」と教えてくれている表示です。
図9 new int[]の部分が薄く表示され、省略できることを示している
このnew int[]の部分を消して、中括弧だけを残してもOKです。
リスト6 右辺の型を省略する
int[] haiD = { 11, 22, 33, 44 };
図10 右辺を中括弧だけにしたhaiD
左辺にint[]、つまり「intの配列だよ」と書いておけば、右辺は中括弧で囲って、その型の値をカンマ区切りで入れておけばよい、ということです。実行してhaiDを確認すると、これもまったく同じ結果になっています。
図11 haiDも要素数4で、同じ値が入っている
ここまでの3つの書き方を並べると、次のようになります。どれも生成される配列は同じです。
リスト7 生成と同時に値を設定する3つの書き方
int[] haiB = new int[] { 11, 22, 33, 44 }; //基本の書き方
var haiC = new int[] { 11, 22, 33, 44 }; //左辺をvarにする
int[] haiD = { 11, 22, 33, 44 }; //右辺の型を省略する
なお、左辺のvarと右辺の型の省略を同時に行うことはできません。var haiX = { 11, 22, 33, 44 };と書くと、左辺にも右辺にも型の情報がなくなり、コンパイラが型を決められないためコンパイルエラーになります。型は左辺か右辺の少なくともどちらかに書く、と覚えておいてください。
違う型の値は入れられない
ちなみに、配列には違う型の値を入れることはできません。試しにint[]の配列の4個目に、文字列の””を入れてみます。
リスト8 int型の配列に文字列を入れようとする(コンパイルエラー)
int[] haiE = { 11, 22, 33, "" }; //コンパイルエラー
図12 4個目に文字列を入れると赤い波線が表示される
“”の部分に赤い波線が表示され、コンパイルエラーになります。int[]は「intの配列」なので、入れられるのはintの値だけです。
数値と文字列の両方を入れたいのであれば、配列の型をobject[]にすれば入れることができます。同様に、文字列だけを入れる配列であればstring[]にします。
図13 配列の型をobject[]にすれば、エラーは消える
リスト9 型に合わせた値を入れる
object[] haiE = { 11, 22, 33, "" }; //objectの配列なら何でも入れられる
string[] haiF = { "A", "B", "C" }; //stringの配列には文字列だけ
ただし、int[]と書いているのであれば、入れられるのはintだけです。これは今回見てきたどの書き方でも同じで、haiBやhaiCのように右辺にnew int[]と書いている場合も、中括弧の中に違う型の値を入れるとエラーになります。
図14 ほかの書き方でも、違う型の値を入れるとエラーになる
サンプルコードには、違う型はNGであることがわかるように、コメントとして残しておきます。
リスト10 button2_Clickの完成形
private void button2_Click(object sender, EventArgs e)
{
//生成と同時に値を設定する
int[] haiA = new int[10];
int[] haiB = new int[] { 11, 22, 33, 44 };
var haiC = new int[] { 11, 22, 33, 44 };
int[] haiD = { 11, 22, 33, 44 };
//違う型はNG
//int[] haiE = { 11, 22, 33, "" };
}
まとめ
配列を生成するときは、角括弧の中の要素数を省略して、後ろに中括弧を付け、カンマ区切りで値を並べることで、最初から値が入った状態の配列を生成できます。左辺をvarにする書き方と、右辺のnew int[]を省略する書き方もあり、どれも結果は同じです。
図15 今回紹介した3つの書き方
最初から値を入れた状態で配列を生成したい場合は、こういった書き方でやってみてください。
■非公開コース「C#14新機能」プレゼント:
非公開コース「C#14新機能」(80分)をご覧になりたい方は
こちらからURLとパスワードを発行していますので、ご覧になってみてください。
非公開コース「C#14新機能」を観る
A01_はじめに
A02_プロジェクトの作成
B01_配列とは
B02_配列の生成とアクセス
B03_生成と同時に値を設定する
B04_型推論による生成
B05_メソッドの引数などにする場合の注意点
B06_Length
B07_IndexOfでの検索
B08_FindIndexでの検索
B09_Find
B10_Exists
B11_FindAllとFindLast
B12_誤ったコピー
B13_Array.Copy
B14_範囲指定のコピー
B15_Resize
C01_ArrayList
C02_List
C03_List 動的な要素の変更
C04_Listのコンストラクタ
C05_Listのコンストラクタ_Capacity
C06_ListTからArrayクラスのメソッドが呼ばれている
D01_コレクションインタフェースとは
D02_異なるコレクションクラスに互換性を持たせる
D03_インタフェースの階層構造
D04_クライアントができる操作を制限させる
D05_クライアントができる操作を制限させる_後半
D06_Enumerableの拡張メソッドに関して
D07_ReadOnly系のコレクションインタフェース
D08_AsReadOnly
D09_ToListでコピーする
D10_ListTはprivateで使う
■非公開コース「C#14新機能」プレゼント:
非公開コース「C#14新機能」(80分)をご覧になりたい方は
こちらからURLとパスワードを発行していますので、ご覧になってみてください。
非公開コース「C#14新機能」を観る