CA1864: 'IDictionary.TryAdd(TKey, TValue)' メソッドを優先する
プロパティ | 値 |
---|---|
ルール ID | CA1864 |
Title | 'IDictionary.TryAdd(TKey, TValue)' メソッドを優先する |
[カテゴリ] | パフォーマンス |
修正が中断ありか中断なしか | なし |
.NET 8 では既定で有効 | 提案として |
原因
Dictionary<TKey,TValue>.Add は Dictionary<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
詳細については、「コード分析の警告を抑制する方法」を参照してください。
.NET