Share via


CA1806:不要忽略方法的結果

屬性
規則識別碼 CA1806
標題 不要忽略方法的結果
類別 效能
修正程式是中斷或非中斷 不中斷
預設在 .NET 8 中啟用 建議

原因

此警告有數個可能的原因:

  • 系統會建立新的 物件,但從未使用過。

  • 會呼叫建立並傳回新字串的方法,而且永遠不會使用新的字串。

  • COM 或 P/Invoke 方法,會傳回 HRESULT 從未使用過的 或 錯誤碼。

  • 語言整合式查詢 (LINQ) 方法,會傳回從未使用的結果。

檔案描述

不必要的物件建立和未使用之物件的相關聯垃圾收集會降低效能。

字串是不可變的,例如 String.ToUpper 傳回字串的新實例,而不是修改呼叫方法中的字串實例。

HRESULT忽略或錯誤碼可能會導致低資源狀況或錯誤狀況中的非預期行為。

已知 LINQ 方法沒有副作用,因此不應忽略結果。

如何修正違規

如果方法建立從未使用過之物件的新實例,請將 實例當做引數傳遞至另一個方法,或將實例指派給變數。 如果不需要建立物件,請將其移除。

-或-

如果方法 A 會呼叫方法 B,但未使用方法 B 傳回的新字串實例,請將 實例當做引數傳遞至另一個方法,或將實例指派給變數。 或者,如果不需要,請移除呼叫。

-或-

如果方法 A 會呼叫方法 B,但未使用 方法傳回的 HRESULT 或 錯誤碼,請在條件陳述式中使用結果、將結果指派給變數,或將它當做引數傳遞給另一個方法。

-或-

如果 LINQ 方法 A 會呼叫方法 B 但未使用結果,請在條件陳述式中使用結果、將結果指派給變數,或將它當做引數傳遞給另一個方法。

隱藏警告的時機

除非建立物件的行為有某種用途,否則請勿隱藏此規則的警告。

隱藏警告

如果您只想要隱藏單一違規,請將預處理器指示詞新增至原始程式檔以停用,然後重新啟用規則。

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

若要停用檔案、資料夾或專案的規則,請在組態檔 中將其嚴重性設定為 。 none

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

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

設定程式碼以分析

使用下列選項來設定程式碼基底要執行此規則的部分。

要強制執行的其他方法

您可以設定此規則來檢查是否使用其他自訂 API 的結果。 將一或多個方法指定為 選項的值 additional_use_results_methods 。 若要指定多個方法名稱,請使用 | 分隔它們。 方法名稱的允許格式如下:

  • 僅限方法名稱(不論其包含類型或命名空間為何,都會包含該名稱的所有方法)。
  • 檔識別碼格式 的完整 名稱,具有選擇性 M: 前置詞。

例如,若要指定規則 CA1806 也應該檢查是否使用名為 MyMethod1 的方法的結果,請將下列機碼/值組新增至專案中的 .editorconfig 檔案。

dotnet_code_quality.CA1806.additional_use_results_methods = MyMethod1

或者,使用完整名稱來厘清或確保只包含具有該名稱的特定方法。

dotnet_code_quality.CA1806.additional_use_results_methods = M:MyNamespace.MyType.MyMethod1(ParamType)

範例 1

下列範例顯示忽略呼叫 String.Trim 結果的類別。

public class Book
{
    private readonly string? _Title;

    public Book(string title)
    {
        if (title != null)
        {
            // Violates this rule
            title.Trim();
        }

        _Title = title;
    }

    public string? Title
    {
        get { return _Title; }
    }
}
Public Class Book
    Public Sub New(ByVal title As String)

        If title IsNot Nothing Then
            ' Violates this rule                
            title.Trim()
        End If

        Me.Title = title

    End Sub

    Public ReadOnly Property Title() As String

End Class

範例 2

下列範例會藉由將傳回的結果 String.Trim 指派給呼叫的變數,來修正 範例 1 違規。

public class Book
{
    private readonly string? _Title;

    public Book(string title)
    {
        if (title != null)
        {
            title = title.Trim();
        }

        _Title = title;
    }

    public string? Title
    {
        get { return _Title; }
    }
}
Public Class Book
    Public Sub New(ByVal title As String)

        If title IsNot Nothing Then
            title = title.Trim()
        End If

        Me.Title = title

    End Sub

    Public ReadOnly Property Title() As String

End Class

範例 3

下列範例示範的方法不會使用它所建立的物件。

注意

此違規無法在 Visual Basic 中重現。

public class Book
{
    public Book()
    {
    }

    public static Book CreateBook()
    {
        // Violates this rule
        new Book();
        return new Book();
    }
}

範例 4

下列範例會藉由移除不必要的物件建立, 修正範例 3 違規。

public class Book
{
    public Book()
    {
    }

    public static Book CreateBook()
    {
        return new Book();
    }
}