Udostępnij za pośrednictwem


CA1846: Preferuj AsSpan ponad Substring

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.

Zobacz też