ジェネリックスを分かりやすく解説!

ホームC#プログラミング入門講座 > ジェネリックスを分かりやすく解説!

ジェネリックスを分かりやすく解説!

C#2.0の新機能

ジェネリックスとは何ぞや!? SDKドキュメント読んでも、@ITの解説読んでも、専門用語ばっかりでわかんねぇ~!!

そんな方のために、私が幼稚園児でも分かるように解説しましょう!!

まず、ジェネリックスは「型付コレクション」と考えてください。これが大原則です。「型付コレクション」の「型付」がC#2.0の新機能なのです。

コレクションとは?

コレクションってのは、実は解説してないんです。配列のようなもの、といって飛ばした記憶がある。

そこでまず、コレクションの代表ArrayListを解説しましょう。

using System;
using System.Collections;
using System.Text;

namespace NormalVersion
{
    class Program
    {
        static void Main(string[] args)
        {
            ArrayList al = new ArrayList();
            al.Add("TRICK");
            al.Add("TRICK2");
            al.Add("TRICK 劇場版");
            al.Add("ごくせん");
            al.Add("木曜ドラマ TRICK");
            al.Add("ごくせん リターンズ");
            al.Add("TRICK 新作スペシャル");
            for (int i = 0; i < al.Count; i++)
            {
                if ((string)al[i] == "ごくせん")
                    Console.WriteLine("ごくせんは" + (i + 1) + "番目");
            }
        }
    }
}

まあ、大して難しくもないですし、配列と役目は大して変わりません。ここで重要なのは、ifのかっこの中です。

if ((string)al[i] == "ごくせん")

(string) って覚えてますよね? キャストです。ArrayList は万能の型 object なので、そのままではダメなんです。stringに変えないと、"ごくせん" と比較できません。

キャストは型変換ですから、失敗するかもしれません。stringかと思ったら int だったなんていう場合もあります。大きい方を小さい方に縮める型変換は、けっこう怖い。

怖くないよ、というならジェネリックはいらんのです。けどまあ、普通は型変換が怖いというので、ジェネリックというのが登場します。

型の事前宣言

using System;
using System.Collections.Generic;
using System.Text;

namespace GenericsVersion
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> al = new List<string>();
            al.Add("TRICK");
            al.Add("TRICK2");
            al.Add("TRICK 劇場版");
            al.Add("ごくせん");
            al.Add("木曜ドラマ TRICK");
            al.Add("ごくせん リターンズ");
            al.Add("TRICK 新作スペシャル");
            for (int i = 0; i < al.Count; i++)
            {
                if (al[i] == "ごくせん")
                    Console.WriteLine("ごくせんは" + (i + 1) + "番目");
            }
        }
    }
}

これが、ジェネリックを使ったバージョンです。結果は同じ。注目は、2つあります。

List<string> al = new List<string>();

同じコレクションを扱うんですが、Listは「型の事前宣言タイプ」です。Listの後に続けて、カクカクと型を付け足します。これで、「string型のList」になります。

if (al[i] == "ごくせん")

もう事前に宣言してますから、キャストは要りません。型を削り落としてしまう心配がなくなります。

カクカクの記号がちょっと異様な感じがしますが、これはかなりすごい変化です。より厳密になって、プログラムの安全性が高まります。

要するに!?

公園があります。

右の公園には何も書かれておらず、左の公園には、「動物の類、入るべからず。ヒトのみ入場を許可す」と書いてあります。

右の公園はイヌやサルもいますから、ごちゃごちゃです。ですが、左の公園にはヒトしかいません。

ジェネリックがあると、コレクションの中身を限定できます。左の公園のように、イヌやサルは入れません。stringならstringだけなので、intやdoubleは入場拒否です。

「型付コレクション」というのは、このように型の安全性をより高めることができるのです。ですから、今後はArrayListではなく、ジェネリックバージョンのListを使うべきです。(ArrayListが必要な場合もある、かも。)

その他

ジェネリックを使えるのは、ArrayListだけではありません。ですが、他のやつは私自身使ったことが無いので、使いたければ自分で調べてください。

また、ジェネリック用のクラスには ArrayList(of T)のようにSDKドキュメントに書いてあります。(of T)は「特定の型の」を意味します。objectという万能の型ではなく、自分で指定しろよ、というマークです。

ジェネリック用のメソッドやプロパティ(これらをメンバ、というんでしたね)には、変なマークが付いています。見たことも無いハデというか地味というか、変なマークですので分かります。

さらに、コレクション・ジェネリックに関連してForEach()メソッドなどの新機能が追加されています。これに関してはまた別のところで解説しましょう。

なお、私自身は中博俊さんの解説「技術解説 .NET 2.0 ジェネリック(Generics)」を読んで理解しました。さらに詳しいので、参考にしてください。


[ ステップアップC# ]