CA1868:對集合不必要呼叫 'Contains'
屬性 | 值 |
---|---|
規則識別碼 | CA1868 |
標題 | 對集合不必要呼叫 'Contains' |
類別 | 效能 |
修正程式是中斷或非中斷 | 不中斷 |
預設在 .NET 8 中啟用 | 建議 |
原因
ISet<T>.Add或 ICollection<T>.Remove 呼叫是由 的 Contains 呼叫所保護。 或者, IImmutableSet<T>.Add 或 IImmutableSet<T>.Remove 呼叫是由 的 IImmutableSet<T>.Contains 呼叫所保護。
檔案描述
和 ICollection<T>.Remove(T) 都會 ISet<T>.Add(T) 執行查閱,讓其事先呼叫 ICollection<T>.Contains(T) 變得備援。 呼叫或 Remove(T) 直接呼叫 Add(T) 會更有效率,它會傳回 Boolean 值,指出專案是否已新增或移除。
此邏輯也適用于 IImmutableSet<T>.Add(T) 和 IImmutableSet<T>.Remove(T) ,不同之處在于,如果新增或移除專案,則會傳回新的集合,如果不是,則傳回原創組合。
如何修正違規
以 ICollection<T>.Contains(T) 對後者方法的單一呼叫取代對 (或 IImmutableSet<T>.Contains(T) ) 的呼叫,後面接著呼叫 ISet<T>.Add(T) 或 ICollection<T>.Remove(T) 或 IImmutableSet<T>.Remove(T)IImmutableSet<T>.Add(T) 。
範例
下列程式碼片段顯示 CA1868 的違規:
void Run(ISet<string> set)
{
if (!set.Contains("Hello World"))
{
set.Add("Hello World");
}
}
Sub Run(set As ISet(Of String))
If Not set.Contains("Hello World") Then
set.Add("Hello World")
End If
End Sub
下列程式碼片段會修正違規:
void Run(ISet<string> set)
{
set.Add("Hello World");
}
Sub Run(set As ISet(Of String))
set.Add("Hello World")
End Sub
隱藏警告的時機
如果效能不相關,則隱藏此警告是安全的。
隱藏警告
如果您只想要隱藏單一違規,請將預處理器指示詞新增至原始程式檔以停用,然後重新啟用規則。
#pragma warning disable CA1868
// The code that's violating the rule is on this line.
#pragma warning restore CA1868
若要停用檔案、資料夾或專案的規則,請在組態檔 中將其嚴重性設定為 。 none
[*.{cs,vb}]
dotnet_diagnostic.CA1868.severity = none
如需詳細資訊,請參閱 如何隱藏程式碼分析警告 。
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應