Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
CA1846: Preferuj
| Właściwości | Wartość |
|---|---|
| Identyfikator reguły | CA1846 |
| Tytuł | Preferuj AsSpan ponad Substring |
| Kategoria | Wydajność |
| Poprawka łamiąca lub nienaruszająca | Niezgodność |
| Domyślnie włączone na platformie .NET 10 | Jako sugestia |
| Zastosowane języki | C# i Visual Basic |
Przyczyna
Wynik wywołania jednej z przeciążeń String.Substring jest przekazywany do metody przyjmującej przeciążenie ReadOnlySpan<Char>.
Opis reguły
Substring przydziela nowy obiekt typu string na stosie dynamicznym i wykonuje pełną kopię danych z 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ągi 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ą łańcuchy znaków, ma również wersje przeciążone, które akceptują ReadOnlySpan<System.Char> argument. Gdy takie przeciążenia są dostępne, możesz zwiększyć wydajność, wywołując AsSpan 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.