0

基本的に、コードコントラクトを使用して、キーがConcurrentDictionaryに存在するかどうかを判断することが、コードコントラクトの許容可能な使用法であるかどうかを知りたいです。実行時の辞書の状態に依存するため、パラメータチェック以上のものであるため、私には正しく感じられません。

public class MyClass
{
    private ConcurrentDictionary<string, object> someItems = 
        new ConcurrentDictionary<string, object>();

    public object GetItem(string itemName)
    {
        Contract.Requires<ArgumentNullException>(!String.IsNullOrWhiteSpace(itemName));

        // ?? Is this a correct alternative to checking for null???
        Contract.Requires<KeyNotFoundException>(someItems.ContainsKey(itemName));

        return someItems[itemName];
    }
}

しかし、それが問題ない場合は、以下の従来の方法に比べて、2つのContract.Requiresと1つのリターンを持つよりクリーンな方法です。

public class MyClass
{
    private ConcurrentDictionary<string, object> someItems = 
        new ConcurrentDictionary<string, object>();

    public object GetItem(string itemName)
    {
        Contract.Requires<ArgumentNullException>(!String.IsNullOrWhiteSpace(itemName));

        // Traditional null check
        var item = someItems[itemName];

        if (item == null)
        {
            throw new KeyNotFoundException("Item " + itemName + " not found.");
        }

        return item;            
    }
}
4

1 に答える 1

0

私には少し奇妙に見えます。クラスの内部状態(つまり、someItems辞書の内容)は、契約の一部ではありません。この方法で使用できますが、コントラクトチェックは、発信者に正確に何が間違っているかを知らせることになっています。この場合、呼び出し元は、を取得した後でも、許可されている引数と許可されていない引数を推測することはありませんKeyNotFoundException

さらに、この特定のケースでは、オブジェクトが辞書に見つからない場合に例外をスローすることは一貫していないように見えますが、私の意見では、を返す方が理にかなっていnullます。

ちなみに、最初の例itemNameでは、辞書で2回検索されています。

于 2013-03-15T22:20:02.630 に答える