C#のHashtableとDictionaryの違いとは?特徴と使い分けを徹底解説
C#では、データを「キー」と「値」のペア(Key/Value)で格納できるコレクションとして、HashtableとDictionaryの2つがよく使われます。一見似ていますが、型の制約やパフォーマンス、エラー処理などに重要な違いがあります。本記事では、両者の違いを比較表とサンプルコードを使ってわかりやすく解説します。
HashtableとDictionaryの主な違い
| 項目 | Hashtable | Dictionary |
|---|---|---|
| 定義 | System.Collections名前空間に属する非ジェネリック(non-generic)コレクション。キーと値のペアでデータを格納します。 | System.Collections.Generic名前空間に属するジェネリックコレクション。こちらもキーと値のペアでデータを格納します。 |
| データ型 | キーと値に異なるデータ型を混在させて格納でき、型の指定は不要です。 | 宣言時にキーと値の型を明示的に指定する必要があります。型安全であることが大きな特徴です。 |
| データ取得の速度 | 値を取り出す際にボックス化・ボックス化解除(boxing/unboxing)が発生するため、処理が遅くなります。 | ボックス化が発生しないため、Hashtableよりも高速にデータを取得できます。 |
| nullの扱い | 存在しないキーにアクセスした場合、nullが返されます(エラーにはなりません)。 | 存在しないキーにアクセスすると、KeyNotFoundException例外がスローされます。 |
| データの順序 | 要素の挿入順序は保持されません。 | 要素の挿入順序が保持されます(※これは実装上の動作であり、公式に保証されているわけではありません)。 |
サンプルコード
// Hashtable の使用例
using System.Collections;
Hashtable hashtable = new Hashtable();
hashtable.Add(1, "りんご"); // int型のキー
hashtable.Add("two", "バナナ"); // string型のキーも混在可能
// Dictionary の使用例
using System.Collections.Generic;
Dictionary<int, string> dictionary = new Dictionary<int, string>();
dictionary.Add(1, "りんご"); // キーはint型、値はstring型に固定
使い分けのポイント
- 新規開発ではDictionaryが推奨: 型安全で高速なため、特別な理由がない限りDictionaryを選びましょう。
- 異なる型のキーや値を扱いたい場合: Hashtableなら型を問わず格納できますが、取り出し時にはキャストが必要になります。
- 存在しないキーへの安全なアクセス: Dictionaryでは
TryGetValueメソッドを使うことで、例外を発生させずに安全に値を取得できます。
まとめ
HashtableとDictionaryは、どちらもキーと値のペアでデータを管理できるコレクションですが、Dictionaryは型安全かつ高速であり、現代のC#開発では第一選択となります。一方、Hashtableはレガシーコードとの互換性や、柔軟な型の扱いが必要な場面で活用できます。それぞれの特性を正しく理解し、状況に応じて使い分けることが大切です。
-
C#におけるDictionaryとHashtableの違いを徹底解説
C#でキーと値のペアを管理する際によく使われるのが、HashtableとDictionaryの2つのコレクションです。結論から言えば、HashtableはDictionaryよりも低速であり、厳密に型指定されたコレクションでは、Dictionaryの方が高速に動作します。 Hashtableとは Hashtableクラスは、キーのハッシュコードに基づいて整理された、キーと値のペアのコレクションを表します。コレクション内の各要素には、キーを使ってアクセスします。HashtableはSystem.Collections名前空間に属する非ジェネリック型のため、格納される値はすべてobject型として
-
C#のListとDictionaryの違いとは?使い分けのポイントを解説
C#におけるListとDictionaryの基本的な違いC#にはさまざまなコレクションクラスが用意されていますが、その中でも特によく使われるのが「List」と「Dictionary」です。両者はいずれもSystem.Collections.Generic名前空間に属するジェネリック型のコレクションですが、データの格納方法やアクセス方法が大きく異なります。Dictionary(ディクショナリ)とはDictionaryは、キーと値のペアを管理するコレクションです。Dictionary<TKey, TValue>の形式で宣言され、System.Collections.Generic名前空