CA1806:不要忽略方法结果

属性
规则 ID CA1806
标题 不要忽略方法结果
类别 “性能”
修复是中断修复还是非中断修复 非中断
在 .NET 9 中默认启用 作为建议

原因

出现此警告有几个可能的原因:

  • 创建了一个新的对象,但从未使用过它。

  • 调用了一个创建并返回新字符串的方法,但从未使用过这个新字符串。

  • 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 选项的值。 若要指定多个方法名称,请用 | 进行分隔。 允许的方法名称格式为:

  • 仅方法名称(其中将包括具有该名称的所有方法,无论其包含类型或命名空间如何)。
  • 完全限定的名称,采用文档 ID 格式,前缀为 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();
    }
}