Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
CA1846: предпочитайте
| Свойство | Значение |
|---|---|
| Идентификатор правила | CA1846 |
| Заголовок | Предпочитать AsSpan вместо Substring |
| Категория | Производительность |
| Исправление является критическим или не критическим | неразрывный |
| Включен по умолчанию в .NET 10 | Как предложение |
| Применимые языки | C# и Visual Basic |
Причина
Результат вызова одной из перегрузок String.Substring передается методу с доступной перегрузкой, который принимает ReadOnlySpan<Char>.
Описание правила
Substring выделяет новый string объект в куче и выполняет полное копирование извлеченного текста. Обработка строк является узким местом производительности для многих программ. Выделение большого количества небольших кратковременных строк на критическом пути может создать достаточную нагрузку на коллекцию, чтобы повлиять на производительность. Копии O(n), создаваемые с помощью Substring, становятся значимыми, когда длина подстрок увеличивается. Типы Span<T> и ReadOnlySpan<T> были созданы для решения этих проблем с производительностью.
Многие API-интерфейсы, принимающие строки, также имеют перегрузки, принимающие аргумент ReadOnlySpan<System.Char>. Если такие перегрузки доступны, можно повысить производительность, вызвав AsSpan вместо Substring.
Устранение нарушений
Чтобы устранить нарушение этого правила, замените вызов string.Substring вызовом одного из методов расширения MemoryExtensions.AsSpan.
using System;
public void MyMethod(string iniFileLine)
{
// Violation
int.TryParse(iniFileLine.Substring(7), out int x);
int.TryParse(iniFileLine.Substring(2, 5), out int y);
// Fix
int.TryParse(iniFileLine.AsSpan(7), out int x);
int.TryParse(iniFileLine.AsSpan(2, 5), out int y);
}
Imports System
Public Sub MyMethod(iniFileLine As String)
Dim x As Integer
Dim y As Integer
' Violation
Integer.TryParse(iniFileLine.Substring(7), x)
Integer.TryParse(iniFileLine.Substring(2, 5), y)
' Fix
Integer.TryParse(iniFileLine.AsSpan(7), x)
Integer.TryParse(iniFileLine.AsSpan(2, 5), y)
End Sub
Когда лучше отключить предупреждения
Подавление предупреждений для этого правила безопасно, если производительность не вызывает проблем.