2011-10-26 9 views
0

私たちは最近、キーが存在することを期待して値を取得するために辞書を呼び出したという問題がありました。プロセスが破られることはありませんでした。ReSharperは辞書キーについて警告していますか?

ReSharperには、ヌルオブジェクトの場合に聞くようなチェック機能がありますか?ここで

は、私が何を言っているかサポートするための例です。

Dictionary<String, Entity> allEntities = 
     new Dictionary<String, Entity>(SringComparer.OrdinalIgnoreCase); 

allEntities.AddMany(db.GetAllEntities()); 

Entity thisEntity = allEntities[entityID]; 
     // <-- error here as EntityID isn't in all entities... 

私はReSharperのは、私はそうのような辞書をチェックしていないと言うことができるようにしたいと思います:

if (allEntities.ContainsKey(entityID)) 
    ... 

ReSharperはありませんが、これはすべての開発者のためにビジネスケースに追加することの1つです。

+3

ReSharperは、データベース呼び出しがどのような値を生成するかをどのように知ることができますか? –

+0

可能な解決策で質問を更新しました... – cjk

+0

分母がゼロであるかどうかをチェックするために、2つの整数を分割するたびに警告することをお勧めしますか? 'string.Substring'を呼び出すたびに警告して、パラメータが文字列の境界内にあるかどうかを確認したいでしょうか?キーが見つからない場合、 'Dictionary.Item'を取得すると' KeyNotFuondException'がスローされるという事実はほとんど秘密ではありません。 C#開発者は、ツールを思い出させるのではなく、そのことを知ることが期待されるべきだと言う人もいるかもしれません。 – AakashM

答えて

2

私は現在ReSharper 6をインストールしていますが、少なくとも私の設定では、その値にアクセスする前にDictionaryContainsKeyでチェックするよう警告しません。

+0

ありがとう、それは私が知りたかったものです。 – cjk

2

Resharperはコンパイル時に使用されるツールです。どのような値が実​​行時に辞書に入れられるのかは、どのようにして知ることができますか?

辞書を確認して、辞書を使って何かをする前に、あなたが望む値があるかどうかを調べることができます。

Entity thisEntity; 
if (allEntities.TryGetValue(entityID, out thisEntity)){ 
    //DoStuff with thisEntity 
} 

か、単にif (allEntities.ContainsKey(entityID)){}

+0

値が存在するかどうかを確認するために辞書をチェックできることはわかっています。 – cjk

+1

代わりにTryGetValueを使用してください。最初に確認してから取得するよりも速いです。 –

8

でも、(私はそれがないとは思わないもの)、それは可能性がある場合に使用し、それはどうなるの全ては、キー辞書にないかもしれないことを警告です - ちょうどオブジェクトがnullである可能性があることを警告するように。あなたがそれが必要だと思っているかどうかをチェックするために、コードにコードを追加する必要があります。

あなたが作成したすべての辞書アクセスについて警告すると、そのような機能は祝福よりも重荷になると思います。それで、コレクションアクセスのあらゆるタイプや、投げられる可能性のあるあらゆる例外について警告することを望んでいると主張することができます。ここでテイクホームメッセージは、あなたがそのような問題をキャッチするためにユニットテストの詳細を頼るべきであるということですではなく、静的解析ツール

EDIT:

あなたが本当にそれをしたい場合はReSharperのは、この機能を持っていないので、あなたは可能性新しいRoslyn APIを使用して自分自身で書くことを考えてください。 this articleを参照してください。

関連する問題