CA1846: Preferuj AsSpan
ponad Substring
Właściwości | Wartość |
---|---|
Identyfikator reguły | CA1846 |
Tytuł | Preferuj AsSpan ponad Substring |
Kategoria | Wydajność |
Poprawka powodująca niezgodność lub niezgodność | Niezgodność |
Domyślnie włączone na platformie .NET 9 | Jako sugestia |
Przyczyna
Wynik wywołania do jednego z String.Substring przeciążeń jest przekazywany do metody z dostępnym przeciążeniem, które akceptuje ReadOnlySpan<Char>
.
Opis reguły
Substring
przydziela nowy string
obiekt na stercie i wykonuje pełną kopię wyodrębnionego tekstu. Manipulowanie ciągami jest wąskim gardłem wydajności dla wielu programów. Przydzielanie wielu małych, krótkotrwałych ciągów na gorącej ścieżce może stworzyć wystarczającą ilość presji kolekcji, aby wpłynąć na wydajność. Kopie O(n) utworzone przez Substring
stają się istotne, gdy podciągy są duże. Typy Span<T> i ReadOnlySpan<T> zostały utworzone w celu rozwiązania tych problemów z wydajnością.
Wiele interfejsów API, które akceptują ciągi, ma również przeciążenia, które akceptują ReadOnlySpan<System.Char>
argument. Gdy takie przeciążenia są dostępne, możesz zwiększyć wydajność, wywołując AsSpan
metodę zamiast Substring
.
Jak naprawić naruszenia
Aby naprawić naruszenie tej reguły, zastąp wywołanie metody string.Substring
wywołaniem do jednej z MemoryExtensions.AsSpan metod rozszerzenia.
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
Kiedy pomijać ostrzeżenia
Można bezpiecznie pominąć ostrzeżenia z tej reguły, jeśli wydajność nie jest problemem.