CA1872:首选基于“BitConverter.ToString”的调用链的“Convert.ToHexString”和“Convert.ToHexStringLower”

规则 ID CA1872
标题 优先选择“Convert.ToHexString”和“Convert.ToHexStringLower”,而不是基于“BitConverter.ToString”的调用链
类别 “性能”
修复是中断修复还是非中断修复 非中断
在 .NET 9 中默认启用 作为建议

原因

BitConverter.ToString调用后跟String.Replace调用删除短划线,用于将字节编码为十六进制字符串表示形式。 如果在 String.ToLower 调用链中使用此规则,也会触发此规则。

规则说明

使用 Convert.ToHexStringConvert.ToHexStringLower 将字节编码为十六进制字符串表示形式。 与结合使用String.Replace删除短划线和删除短划线相比,这些方法更加高效和String.ToLower分配友好BitConverter.ToString

如何解决冲突

若要修复此规则的冲突,请将调用链替换为或 Convert.ToHexStringConvert.ToHexStringLower

示例

以下代码片段显示了 CA1872 的冲突:

using System;
using System.Text;

class HelloWorldEncoder
{
    private readonly byte[] _data = Encoding.ASCII.GetBytes("Hello World");

    public string Encode()
    {
        return BitConverter.ToString(_data).Replace("-", "");
    }

    public string EncodeToLower()
    {
        return BitConverter.ToString(_data).Replace("-", "").ToLower();
    }
}
Imports System
Imports System.Text

Class HelloWorldEncoder
    Private ReadOnly _data As Byte() = Encoding.ASCII.GetBytes("Hello World")

    Public Function Encode() As String
        Return BitConverter.ToString(_data).Replace("-", "")
    End Function

    Public Function EncodeToLower() As String
        Return BitConverter.ToString(_data).Replace("-", "").ToLower()
    End Function
End Class

以下代码片段修复了冲突:

using System;
using System.Text;

class HelloWorldEncoder
{
    private readonly byte[] _data = Encoding.ASCII.GetBytes("Hello World");

    public string Encode()
    {
        return Convert.ToHexString(data);
    }

    public string EncodeToLower()
    {
        return Convert.ToHexStringLower(data);
    }
}
Imports System
Imports System.Text

Class HelloWorldEncoder
    Private ReadOnly _data As Byte() = Encoding.ASCII.GetBytes("Hello World")

    Public Function Encode() As String
        Return Convert.ToHexString(data)
    End Function

    Public Function EncodeToLower() As String
        Return Convert.ToHexStringLower(data)
    End Function
End Class

何时禁止显示警告

可以安全地禁止显示此规则的警告;但是,我们建议使用或 Convert.ToHexStringConvert.ToHexStringLower.

抑制警告

如果只想抑制单个冲突,请将预处理器指令添加到源文件以禁用该规则,然后重新启用该规则。

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

若要对文件、文件夹或项目禁用该规则,请在配置文件中将其严重性设置为 none

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

有关详细信息,请参阅如何禁止显示代码分析警告