このレクチャーでは、C#で配列を生成する方法と、生成した配列の要素に値を設定・アクセスする方法を解説します。配列はコレクションの中でもっとも基本となるデータ構造で、この後に登場するList<T>も内部では配列を使って実装されています。ここでしっかり基本を押さえておきましょう。
図1 B02_配列の生成とアクセス
1. 検証用のボタンを用意する
事前に作成しておいたWindows Formsのプロジェクト(WinFormsApp1)を使います。Form1のデザイン画面を開き、ツールボックスからButtonをドラッグしてフォーム上に配置します。
図2 ツールボックスからButtonを選択する
配置したボタンを選択した状態でプロパティウィンドウを開き、Textプロパティを「配列の生成」に変更します。
図3 TextプロパティにButtonの表示名「配列の生成」を設定
ボタンをダブルクリックすると、Clickイベントのハンドラーであるbutton1_Clickメソッドが自動生成され、コードエディターに切り替わります。以降のコードはすべてこのメソッドの中に書いていきます。
図4 ダブルクリックで生成されたbutton1_Clickメソッド
リスト1 Form1.cs(自動生成されたイベントハンドラー)
private void button1_Click(object sender, EventArgs e)
{
//配列の生成
}
2. 配列の書き方は「型+[]」
配列の型は、「配列にしたい型」の後ろに角括弧[]を付けて表します。たとえばintの配列を作りたいのであればint[]、stringの配列であればstring[]となります。
図5 配列の型は「型+[]」で表す
リスト2 配列型の書き方
int[] // intの配列 string[] // stringの配列
3. 要素の数を指定して生成する
配列は基本的に、生成するときに要素の数を決めておく必要があります。new int[10]のように、角括弧の中に要素数を指定します。これで「int型の値を10個格納できる領域」が確保されます。変数名はhaiAとしました。
図6 new int[10]で要素数10の配列を生成
リスト3 要素数10のint配列を生成する
private void button1_Click(object sender, EventArgs e)
{
//配列の生成
int[] haiA = new int[10];
}
4. 実行して中身を確認する
メソッドの閉じ括弧の行にブレークポイントを置き、実行して「配列の生成」ボタンをクリックします。ブレークで止まったらhaiAにマウスカーソルを合わせると、データヒントに{int[10]}と表示され、10個分の領域ができていることが確認できます。
図7 データヒントでhaiAが{int[10]}であることを確認
展開して中身を見ると、ここで注意すべき点が分かります。インデックスは[0]から始まり、[9]で終わっています。0〜9で合計10個です。つまり、配列のインデックスは0始まり(ゼロインデックス)で、最後の要素のインデックスは「要素数-1」になります。
図8 インデックスは[0]から始まり[9]で終わる
また、まだ何も値を設定していないにもかかわらず、各要素には0が入っています。配列をnewで生成すると、各要素はその型の既定値(intなら0、参照型ならnull)で初期化されるためです。
5. 左辺はvarでもよい
右辺のnew int[10]から型が明らかなので、左辺の型はvarで書くこともできます。var haiB = new int[10];はint[] haiB = new int[10];とまったく同じ意味になります。
図9 左辺をvarにしたhaiB
リスト4 左辺をvarにした書き方
//配列の生成 //要素の数を指定する int[] haiA = new int[10]; //左辺はvarでもよい var haiB = new int[10];
6. 値の設定とアクセス
配列の要素への値の設定や取り出しは、変数名[インデックス]の形で行います。先ほど確認したとおりインデックスは0始まりなので、1個目の要素は[0]、2個目は[1]、3個目は[2]となります。
リスト5 インデックスを指定して値を設定する(完成コード)
private void button1_Click(object sender, EventArgs e)
{
//配列の生成
//要素の数を指定する
int[] haiA = new int[10];
//左辺はvarでもよい
var haiB = new int[10];
//値の設定:ゼロインデックス始まり
haiA[0] = 11;
haiA[1] = 21;
haiA[2] = 31;
}
図10 値の設定はゼロインデックス始まり
実行してブレークポイントで止め、haiAの中身を確認します。[0]に11、[1]に21、[2]に31が入り、値を設定していない[3]以降は0のままになっていることが分かります。
図11 [0]〜[2]に11・21・31が設定されている
値を読み出す場合も同じく変数名[インデックス]で取得できます。また、インデックスに範囲外の値(このケースでは10以上や負の値)を指定すると、実行時にIndexOutOfRangeExceptionが発生します。0始まりであることを意識し、最後の要素は「要素数-1」であることに注意しましょう。
リスト6 (参考)値の取得と範囲外アクセス
//値の取得(アクセス) int value = haiA[1]; // 21 //最後の要素は「要素数-1」 int last = haiA[9]; // 0(未設定なので既定値) //範囲外を指定すると実行時に例外 //int error = haiA[10]; // IndexOutOfRangeException
まとめ
配列の型は「型+[]」で表し、new int[10]のように生成時に要素の数を指定します。左辺はvarで書いても同じ意味になります。生成直後の各要素は型の既定値で初期化されています。
値の設定やアクセスはインデックスで行い、インデックスは0から始まって「要素数-1」で終わります。この「ゼロインデックス始まり」は配列に限らず、この後に学ぶList<T>など多くのコレクションに共通するルールなので、しっかり覚えておきましょう。
■非公開コース「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新機能」を観る