2005の「ジェネリック」を丁寧に解説。2005(以下、VB)には、たくさんの新機能が導入されています。その中でもプログラマにとって今後欠かせない機能となるのは、やはり「ジェネリック」(Generics)です。2.0新機能徹底解説:開発生産性を飛躍的に高めるジェネリックしかしC#やVBのビギナーにとって、ジェネリックは少々分かりづらい機能でもあります。本稿では2回にわたり、ジェネリックにより何ができるのか、どのように使うのかといったジェネリックの基本事項を分かりやすくまとめてみます。ジェネリックとは?ジェネリックとは、簡単にいうと、特定の型(クラス)に依存しないクラスやメソッドを記述するための仕組みです。この仕組みは、クラス、構造体、インターフェイス、メソッド、デリゲートに適用でき、ジェネリックの仕組みを使ったクラスやメソッドは、「ジェネリック・クラス」や「ジェネリック・メソッド」などと呼ばれます。実際には、ジェネリックはコレクション(コレクション・クラス)を便利に利用/実装するための仕組みといえます。コレクションとは、複数のオブジェクトをまとめて管理するためのもので、代表的なものにリストやハッシュテーブルなどがあります(リストは配列と操作方法が似ていますが、配列がサイズ固定なのに対してリストはオブジェクトをいくつでも追加できます)。2.0のクラス・ライブラリには、このジェネリックの機能を使用して実装されたコレクションが多数追加されています。このため、それらの新しいコレクションを利用すれば、以前の1.xのころに比べて、プログラムをすっきりと効率的に記述できるようになっています。1.xで最もよく使用されたコレクションであろうで「ArrayListクラス」について簡単に振り返ってみます。ArrayListクラスはSystem.Collections名前空間に分類されているクラスです。2.0でももちろんArrayListクラスは利用可能です。ArrayListクラスでは、Addメソッドによりコレクションの要素となるオブジェクトを追加していきます(以降のコードでは上がC#、下がVBのコードとなっています)。ArrayListalist.Add("こんにちわ")alist.Add("さようなら")Addメソッドによる要素の追加(ArrayList)コレクションに追加された要素は、インデクサにより取り出すことができます。ArrayListクラスの不便な点の1つは、取り出した要素を扱うのに、元の型にキャストする必要があることでした。キャストが必要インデクサによる要素の取り出し(ArrayList)VBではDirectCastキーワードでもキャストが可能。これは、ArrayListクラスが内部で要素をObject型として取り扱っているためです。文字列型のオブジェクトを格納しても、それを取り出すときにはすべてObject型となってしまいます。これを元に戻すためにキャストが必要となります。Objectクラスはすべてのクラスの基本クラスであるので、ArrayListクラスはどのような型のオブジェクトも格納できます。このため、ArrayListオブジェクトには、コレクションの要素として、ほかの型のオブジェクトも混ぜることができてしまいます。要素としてUri型を追加Addメソッドによる要素の追加(ArrayList)ArrayListオブジェクトにはどのような型のオブジェクトも追加できる。文字列ばかりを入れたつもりのコレクションに、なぜか誤ってこのようなUri型のオブジェクトを入れてしまうと*、それを取り出すときに、当然ながら文字列型へのキャストは失敗して実行時にエラーとなります。ここでUri型を使ったのには特に意味はありません。String)文字列型以外のオブジェクトを文字列型にキャスト(ArrayList)alistの3番目の要素がUriオブジェクトである場合。コンパイルできるが、実行時に例外が発生する。Each文)を使うと便利ですが、関係のない型のオブジェクトが混ざっていると、同様に実行時にエラーとなってしまいます。alistConsole.WriteLine(s)Nextforeach文による要素の列挙(ArrayList)alistに文字列以外が含まれている場合、実行時にその要素を取り出すときに例外が発生する。以上のコードをまとめたコンパイル可能なソース・コードを以下に示しておきます。ModuleArrayListクラスを使用したサンプル・プログラム次にジェネリック版ArrayListクラスである、Listジェネリック・クラスを見ていきます。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。