Udostępnij przez


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 8 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.

Zobacz też