Поделиться через


CA1872: предпочитайте "Convert.ToHexString" и "Convert.ToHexStringLower" по цепочкам вызовов на основе BitConverter.ToString.

Значение
Идентификатор правила CA1872
Заголовок Предпочитать и Convert.ToHexStringLower переопределить Convert.ToHexString цепочки вызовов на основеBitConverter.ToString
Категория Производительность
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 9 Как предложение

Причина

Вызов, за String.Replace которым следует вызов BitConverter.ToString для удаления дефисов, используется для кодирования байтов в шестнадцатеричное строковое представление. Это правило также возникает, если String.ToLower используется в цепочке вызовов.

Описание правила

Используйте Convert.ToHexString или Convert.ToHexStringLower когда кодирование байтов в шестнадцатеричное строковое представление. Эти методы более эффективны и удобны для выделения, чем используются BitConverter.ToString в сочетании с String.Replace удалением дефисов и String.ToLower.

Устранение нарушений

Чтобы устранить нарушение этого правила, замените цепочку вызовов либо Convert.ToHexString Convert.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.ToHexString.Convert.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

Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.