2006年10月15日
川俣晶の縁側ソフトウェア技術雑記total 5861 count

.NET Framework 2.0にて、Genericsを使ってHashtableをDictionaryに単純置き換えできないケース

Written By: 川俣 晶連絡先

 あたた。

 こんなところに落とし穴が……。

 .NET Framework 2.0で、System.collections.HashtableをSystem.collections.generics.Dictionaryに単純置き換えできないケースがあります。

インデクサ(itemプロパティ)の動作の違い §

 コレクションに存在しないkeyの値を指定してインデクサでアクセスを行うと(たとえばhashTable[key])、両者の動作は決定的に異なります。

System.collections.Hashtable→nullを返す

System.collections.generics.Dictionary→KeyNotFoundException例外を投げる

 例外のような重い処理を回避するために、System.collections.generics.DictionaryにはTryGetValueメソッドが用意されています。しかし、このメソッドはoutパラメータによって値を受け取る仕様であるため、受け渡し用の変数を宣言しなければなりません。そのため、単純な文字列置換で置き換えることができません。

string val;

bool result = dictionary.TryGetValue(key,out val);

(valに値が入る)

検証ソース (C# 2.0) §

using System;

using System.Collections;

using System.Collections.Generic;

using System.Text;

namespace ConsoleApplication90

{

    class Program

    {

        static void Main(string[] args)

        {

            Hashtable hashTable = new Hashtable();

            Dictionary<string, string> dictionary = 

                                        new Dictionary<string, string>();

            string key = string.Empty;

            Console.WriteLine("hashTable[key] = {0}", 

                           hashTable[key] == null ? "null" : "not null");

            try

            {

                Console.WriteLine("dictionary[key] = {0}", 

                        dictionary[key] == null ? "null" : "not null");

            }

            catch (KeyNotFoundException)

            {

                Console.WriteLine(

                    "dictionary[key] throwed KeyNotFoundException");

            }

            string val;

            bool result = dictionary.TryGetValue(key,out val);

            Console.WriteLine("dictionary[key] = {0}/{1}", 

                          val == null ? "null" : "not null", result);

        }

    }

}

結果 §

hashTable[key] = null

dictionary[key] throwed KeyNotFoundException

dictionary[key] = null/False

感想 §

 System.collections.Hashtableの仕様の方が優れているような気がします。

 理屈ではSystem.collections.generics.Dictionaryの仕様になることを理解できますが、実際に動くプログラムを書くという意味では、あまり現実的ではないような気がします。

 なぜかといえば。

 コレクションの処理はループの内側の方で繰り返し実行されることが多いような気がしますが、そういうところで例外処理を行うのは重すぎるし、かといってTryGetValueメソッドを使うと表現がまわりくどくなってしまいます。

 うーん、悩ましい。

Facebook

キーワード【 川俣晶の縁側ソフトウェア技術雑記
【技術雑記】の次のコンテンツ
2006年
10月
17日
まさに疲労困憊・ほんとんど復旧に1日を費やしたファイルサーバHDDトラブルの顛末
3days 0 count
total 5504 count
【技術雑記】の前のコンテンツ
2006年
10月
15日
メソッドが匿名であることの決定的な価値とは
3days 0 count
total 3407 count

このコンテンツを書いた川俣 晶へメッセージを送る

[メッセージ送信フォームを利用する]

メッセージ送信フォームを利用することで、川俣 晶に対してメッセージを送ることができます。

この機能は、100%確実に川俣 晶へメッセージを伝達するものではなく、また、確実に川俣 晶よりの返事を得られるものではないことにご注意ください。

このコンテンツへトラックバックするためのURL

https://mag.autumn.org/tb.aspx/20061015192611
サイトの表紙【技術雑記】の表紙【技術雑記】のコンテンツ全リスト 【技術雑記】の入手全リスト 【技術雑記】のRSS1.0形式の情報このサイトの全キーワードリスト 印刷用ページ

管理者: 川俣 晶連絡先

Powered by MagSite2 Version 0.36 (Alpha-Test) Copyright (c) 2004-2021 Pie Dey.Co.,Ltd.