Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
| Свойство | Значение |
|---|---|
| Идентификатор правила | CA1832 |
| Заголовок | используйте AsSpan или AsMemory вместо индексаторов на основе диапазона для получения части массива ReadOnlySpan или ReadOnlyMemory |
| Категория | Производительность |
| Исправление является критическим или не критическим | неразрывный |
| Включен по умолчанию в .NET 10 | Как предложение |
| Применимые языки | C# и Visual Basic |
Причина
При использовании индексатора на основе диапазона для массива с неявным присваиванием значения структурам ReadOnlySpan<T> или ReadOnlyMemory<T>.
Описание правила
Индексатор диапазона для объекта Span<T> является операцией без копирования Slice. Но для индексатора диапазона массива метод GetSubArray будет использоваться вместо Slice, который создает копию запрошенной части массива. Эта копия обычно не требуется, если она неявным образом используется в качестве значения ReadOnlySpan<T> или ReadOnlyMemory<T>. Если не предполагается создание копии, используйте метод AsSpan или AsMemory для избежания ненужного копирования. Если требуется создать копию, сначала назначьте ее локальной переменной или добавьте явное приведение.
Анализатор выводит сообщение только в том случае, когда в результате операции индексатора диапазона используется неявное приведение.
Обнаруживает
Неявные преобразования:
ReadOnlySpan<SomeT> slice = arr[a..b];ReadOnlyMemory<SomeT> slice = arr[a..b];
Не обнаруживает
Явные преобразования:
ReadOnlySpan<SomeT> slice = (ReadOnlySpan<SomeT>)arr[a..b];ReadOnlyMemory<SomeT> slice = (ReadOnlyMemory<SomeT>)arr[a..b];
Устранение нарушений
Чтобы устранить нарушение этого правила, используйте AsSpan метод или AsMemory метод расширения, чтобы избежать создания ненужных копий данных.
class C
{
public void TestMethod(byte[] arr)
{
// The violation occurs for both statements below
ReadOnlySpan<byte> tmp1 = arr[0..2];
ReadOnlyMemory<byte> tmp3 = arr[5..8];
...
}
}
class C
{
public void TestMethod(byte[] arr)
{
// The violations fixed with AsSpan or AsMemory accordingly
ReadOnlySpan<byte> tmp1 = arr.AsSpan()[0..2];
ReadOnlyMemory<byte> tmp3 = arr.AsMemory()[5..8];
...
}
}
Совет
Для этого правила в Visual Studio доступно исправление кода. Чтобы использовать его, поместите курсор на нарушение и нажмите Ctrl+. (точка). Выберите Использовать AsSpan вместо индексатора, основанного на Range, в массиве из представленного списка параметров.
Вы также можете избежать этого предупреждения, добавив явный приведение.
class C
{
public void TestMethod(byte[] arr)
{
// The violation occurs
ReadOnlySpan<byte> tmp1 = arr[0..2];
ReadOnlyMemory<byte> tmp3 = arr[5..8];
...
}
}
class C
{
public void TestMethod(byte[] arr)
{
// The violation fixed with explicit casting
ReadOnlySpan<byte> tmp1 = (ReadOnlySpan<byte>)arr[0..2];
ReadOnlyMemory<byte> tmp3 = (ReadOnlyMemory<byte>)arr[5..8];
...
}
}
Когда лучше отключить предупреждения
Можно подавить нарушение этого правила, если предполагается создание копии.
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#pragma warning disable CA1832
// The code that's violating the rule is on this line.
#pragma warning restore CA1832
Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none в файле конфигурации.
[*.{cs,vb}]
dotnet_diagnostic.CA1832.severity = none
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.
Связанные правила
- CA1831: используйте AsSpan вместо индексаторов на основе диапазона для строки при необходимости
- CA1833: используйте AsSpan или AsMemory вместо индексаторов на основе диапазона для извлечения части Span или Memory массива.