共用方式為


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

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

原因

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

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