CA1864: 'IDictionary.TryAdd(TKey, TValue)' メソッドを優先する

プロパティ
ルール ID CA1864
Title 'IDictionary.TryAdd(TKey, TValue)' メソッドを優先する
[カテゴリ] パフォーマンス
修正が中断ありか中断なしか なし
.NET 8 では既定で有効 提案として

原因

Dictionary<TKey,TValue>.AddDictionary<TKey,TValue>.ContainsKey(TKey) 呼び出しによって保護されます。

規則の説明

Dictionary<TKey,TValue>.ContainsKey(TKey)Dictionary<TKey,TValue>.Add は両方とも検索を実行しますが、これは冗長です。 キーがディクショナリに既に存在する場合、Dictionary<TKey,TValue>.Add は例外もスローします。 Dictionary<TKey,TValue>.TryAdd を呼び出すと、値が追加されたかどうかを示すブール値が返されるため、より効率的です。 キーが既に存在する場合、TryAdd はキーの値を上書きしません。

違反の修正方法

Dictionary<TKey,TValue>.Add への呼び出しの前に、Dictionary<TKey,TValue>.ContainsKey(TKey) への呼び出しを Dictionary<TKey,TValue>.TryAdd への 1 回の呼び出しに置き換えます。

次のコード スニペットは、CA1864 の違反を示しています:

void Run(IDictionary<int, string> dictionary)
{
    if(!dictionary.ContainsKey(2)) {
        dictionary.Add(2, "Hello World");
    }
}
Sub Run(dictionary As IDictionary(Of Integer, String))
    If Not dictionary.ContainsKey(2) Then
        dictionary.Add(2, "Hello World")
    End If
End Sub

次のコード スニペットでは違反を修正しています。

void Run(IDictionary<int, string> dictionary)
{
    dictionary.TryAdd(2, "Hello World");
}
Sub Run(dictionary As IDictionary(Of Integer, String))
    dictionary.TryAdd(2, "Hello World")
End Sub

どのようなときに警告を抑制するか

パフォーマンスに問題がなく、Dictionary<TKey,TValue>.Add によってスローされる可能性のある例外を処理する場合は、この警告を抑制しても問題ありません。

警告を抑制する

単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。

#pragma warning disable CA1864
// The code that's violating the rule is on this line.
#pragma warning restore CA1864

ファイル、フォルダー、またはプロジェクトの規則を無効にするには、構成ファイルでその重要度を none に設定します。

[*.{cs,vb}]
dotnet_diagnostic.CA1864.severity = none

詳細については、「コード分析の警告を抑制する方法」を参照してください。