C# も、もうVer.7まで進歩して、別のもので置き換えられる(置き換えた)方がいいものも出てきています。
「非ジェネリック」って何?
いきなり「非ジェネリック」と言われると戸惑うかもしれません。まず「非ジェネリック」というからには、「ジェネリック」もあります。
「ジェネリック」と「非ジェネリック」
「非ジェネリック」は System.Collections名前空間の直下にあるクラス群です。
「ジェネリック」はVisual Studio でC#のプロジェクトを作った時にも見られます。
下記の行は、Visual Studioが自動で生成してくれます。
using System.Collections.Generic;
これがジェネリック コレクションの名前空間(System.Collections.Generic)です。
平たく言うと、”System.Collections.Generic”配下にあるかないかの違いです。
以前「C# ArrayListとList<T>」でもちょっと触れていますが、このArrayListとList<T>も「非ジェネリック(ArrayList)」と「ジェネリック(List<T>)」です。
なぜ「非ジェネリック」は使えない?
「ジェネリック」は、C# 2.0から登場し、C++をやっていた人には扱いやすい「コンテナのテンプレートクラス」の形をとっています。
「非ジェネリック」は使えない
というより、
「非ジェネリック」より「ジェネリック」のほうが効率的で使いやすい
といったほうが良いかもしれません。
「C# ArrayListとList<T>」のテスト結果もそうだったのですが、処理効率はジェネリックのほうが高いようです。
理由は、ArrayListで管理している要素は”Object型”なのでどのようなクラスでも保持できるというメリットがあるのですが、逆に「取り扱うためのキャストが必要になる」というデメリットがあるからでした。
「非ジェネリック」はすべて「ジェネリック」に置き換えられる?
では、「非ジェネリック」のクラスは「ジェネリック」のクラスに置き換えれるか。ということになりますが、結論を言うと「置き換えることができます」。
非ジェネリック(System.Collections)版 | ジェネリック(System.Collections.Generic)版 | 概要 |
ArrayList | List<T> | リスト(ベクタ) |
– | LinkedList<T> | 双方向連結リスト |
Stack | Stack<T> | スタック(LIFO: Last In First Out) |
Queue | Queue<T> | キュー(FIFO: First In First Out ) |
Hashtable | Dictionary<TKey, TValue> | ハッシュテーブル |
– | SortedDictionary<TKey, TValue> | 二分探索木リスト |
SortedList | SortedList<TKey, TValue> | 整列済みリスト |
– | HashSet<T> | ハッシュテーブル方式で要素を管理するセット(.NET 4 以降) |
– | SortedSet<T> | 二分探索木方式で要素を管理するセット(.NET 4 以降) |
過去に「非ジェネリック」で作ったものを、わざわざ置き換えることまではないと思いますが、これから作るときは「非ジェネリック」より「ジェネリック」を使ったほうがよいかもしれません。
実際に置き換えるときのポイントは「非ジェネリックで扱っているデータ型をはっきりさせる必要性がある」ということです。