CA2018: count
аргумент, который Buffer.BlockCopy
необходимо указать количество байтов для копирования
Свойство | Значение |
---|---|
Идентификатор правила | CA2018 |
Заголовок | Аргумент count в Buffer.BlockCopy должен задавать число байт копирования |
Категория | Надежность |
Исправление является критическим или не критическим | Не критическое |
Включен по умолчанию в .NET 9 | Как предупреждение |
Причина
Это правило срабатывает, если 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));
}
}
Когда лучше отключить предупреждения
Отключать предупреждения из этого правила обычно НЕ безопасно.