C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#のHashtableとDictionaryの違いとは?特徴と使い分けを徹底解説

C#では、データを「キー」と「値」のペア(Key/Value)で格納できるコレクションとして、HashtableDictionaryの2つがよく使われます。一見似ていますが、型の制約やパフォーマンス、エラー処理などに重要な違いがあります。本記事では、両者の違いを比較表とサンプルコードを使ってわかりやすく解説します。

HashtableとDictionaryの主な違い

項目HashtableDictionary
定義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はレガシーコードとの互換性や、柔軟な型の扱いが必要な場面で活用できます。それぞれの特性を正しく理解し、状況に応じて使い分けることが大切です。

  1. C#におけるDictionaryとHashtableの違いを徹底解説

    C#でキーと値のペアを管理する際によく使われるのが、HashtableとDictionaryの2つのコレクションです。結論から言えば、HashtableはDictionaryよりも低速であり、厳密に型指定されたコレクションでは、Dictionaryの方が高速に動作します。 Hashtableとは Hashtableクラスは、キーのハッシュコードに基づいて整理された、キーと値のペアのコレクションを表します。コレクション内の各要素には、キーを使ってアクセスします。HashtableはSystem.Collections名前空間に属する非ジェネリック型のため、格納される値はすべてobject型として

  2. C#のListとDictionaryの違いとは?使い分けのポイントを解説

    C#におけるListとDictionaryの基本的な違いC#にはさまざまなコレクションクラスが用意されていますが、その中でも特によく使われるのが「List」と「Dictionary」です。両者はいずれもSystem.Collections.Generic名前空間に属するジェネリック型のコレクションですが、データの格納方法やアクセス方法が大きく異なります。Dictionary(ディクショナリ)とはDictionaryは、キーと値のペアを管理するコレクションです。Dictionary<TKey, TValue>の形式で宣言され、System.Collections.Generic名前空