CA1868:對集合不必要呼叫 'Contains'

屬性
規則識別碼 CA1868
標題 對集合不必要呼叫 'Contains'
類別 效能
修正程式是中斷或非中斷 不中斷
預設在 .NET 8 中啟用 建議

原因

ISet<T>.AddICollection<T>.Remove 呼叫是由 的 Contains 呼叫所保護。 或者, IImmutableSet<T>.AddIImmutableSet<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

如需詳細資訊,請參閱 如何隱藏程式碼分析警告