CA2018: count аргумент, который Buffer.BlockCopy необходимо указать количество байтов для копирования

Свойство Значение
Идентификатор правила CA2018
Заголовок Аргумент count в Buffer.BlockCopy должен задавать число байт копирования
Категория Надежность
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 8 Как предупреждение

Причина

Это правило срабатывает, если Array.Length используется для аргумента count параметра Buffer.BlockCopy в массивах, элементы которых имеют размер больше одного байта.

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

При использовании Buffer.BlockCopy аргумент count указывает число копируемых байт. Использовать Array.Length для аргумента count следует только с массивами с размером элементов ровно один байт. Массивы с однобайтовым размером элементов: byte, sbyte и bool.

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

Укажите, сколько байтов нужно скопировать для аргумента count.

Пример

Нарушение:

using System;
class Program
{
    static void Main()
    {
        int[] src = new int[] {1, 2, 3, 4};
        int[] dst = new int[] {0, 0, 0, 0};

        Buffer.BlockCopy(src, 0, dst, 0, src.Length);
    }
}

Исправление:

Если элементы массива имеют размер больше одного байта, можно умножить длину массива на размер элемента, чтобы узнать количество байтов.

using System;
class Program
{
    static void Main()
    {
        int[] src = new int[] {1, 2, 3, 4};
        int[] dst = new int[] {0, 0, 0, 0};

        Buffer.BlockCopy(src, 0, dst, 0, src.Length * sizeof(int));
    }
}

Когда лучше отключить предупреждения

Отключать предупреждения из этого правила обычно НЕ безопасно.

См. также