nomurabbitのブログ

nomurabbitのブログはITを中心にした技術ブログです。

nomurabbitのブログ

ジェネリックな型と非ジェネリックな型について

<はじめに>
ジェネリックについて調べていたらこんな記述がありました。

ジェネリック コレクションを使用する状況
通常は、ジェネリック コレクションを使用することをお勧めします。それは、タイプ セーフの利点をすぐに得られるからです。

タイプセーフの利点?いまいちピンとこなかったので、サンプルプログラムを書いてみました。


<プログラム>

class Program
{
    static void Main(string[] args)
    {
        GenericTest<string> genericTest = new GenericTest<string>();
        genericTest.Add("スカルミリョーネ");
        genericTest.Add("カイナッツォ");
        genericTest.Add("バルバリシア");
        genericTest.Add("ルビカンテ");

        NonGenericTest nonGenericTest = new NonGenericTest();
        nonGenericTest.Add(1192);
        nonGenericTest.Add("いいくに作ろう鎌倉幕府");
        nonGenericTest.Add(null);
        nonGenericTest.Add(3.14159265359);

        Console.WriteLine("// ジェネリック");

        //--------------------------------------------------
        // 指定した型のみを扱えばいいのでスッキリ!
        //
        foreach (var item in genericTest)
        {
            Console.WriteLine(item);
        }

        Console.WriteLine("// 非ジェネリック");

        //--------------------------------------------------
        // 何が来るかわからないのでイライラ >_<;
        //
        foreach (var item in nonGenericTest)
        {
            if (item == null)
            {
                continue;
            }

            Console.WriteLine(item.ToString());
        }
    }
}

class GenericTest<T> : IEnumerable<T>
{
    //--------------------------------------------------
    // クラス変数(List)
    //
    private List<T> myList = new List<T>();

    //--------------------------------------------------
    // 要素を追加
    //
    public void Add(T tempItem)
    {
        myList.Add(tempItem);
    }

    //--------------------------------------------------
    // IEnumerable<T>.GetEnumeratorメソッド
    //
    public IEnumerator<T> GetEnumerator()
    {
        for (int i = 0; i < myList.Count; i++)
        {
            yield return myList[i];
        }
    }

    //--------------------------------------------------
    // IEnumerable.GetEnumeratorメソッド
    //
    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

class NonGenericTest : IEnumerable
{
    //--------------------------------------------------
    // クラス変数(List)
    //
    private ArrayList myList = new ArrayList();

    //--------------------------------------------------
    // 要素を追加
    //
    public void Add(object tempItem)
    {
        myList.Add(tempItem);
    }

    //--------------------------------------------------
    // IEnumerable.GetEnumeratorメソッド
    //
    IEnumerator IEnumerable.GetEnumerator()
    {
        for (int i = 0; i < myList.Count; i++)
        {
            yield return myList[i];
        }
    }
}


<実行結果>
f:id:nomurabbit:20131018234240p:plain


<まとめ>
ジェネリックコレクションだと要素の型のTが担保されるってことですね!一方非ジェネリックコレクションだと要素の型が担保されないから、クラス内で要素の追加時にhogehogeするか、foreachで回しながらfugafugaするしかないってことですね!