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