CA1831: Använd AsSpan i stället för Intervallbaserade indexerare för sträng när det är lämpligt

Property Värde
Regel-ID CA1831
Title Använd AsSpan i stället för Intervallbaserade indexerare för sträng när det är lämpligt
Kategori Prestanda
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 Som varning

Orsak

En range-indexer används på en sträng och värdet tilldelas implicit till ReadOnlySpan<char>.

Regelbeskrivning

Den här regeln utlöses när du använder en intervallindexerare på en sträng och tilldelar den till en intervalltyp. Intervallindexeraren på en Span<T> är en icke-kopieringsåtgärd Slice , men för intervallindexeraren på en sträng används metoden Substring i stället för Slice. Då skapas en kopia av den begärda delen av strängen. Den här kopian är vanligtvis onödig när den implicit används som ett ReadOnlySpan<T> eller ReadOnlyMemory<T> -värde. Om en kopia inte är avsedd använder du AsSpan metoden för att undvika den onödiga kopian. Om kopian är avsedd tilldelar du den till en lokal variabel först eller lägger till en explicit gjutning. Analysatorn rapporterar endast när en implicit gjutning används på resultatet av range indexer-åtgärden.

Upptäcker

Implicit konvertering:

ReadOnlySpan<char> slice = str[a..b];

Identifierar inte

Explicit konvertering:

ReadOnlySpan<char> slice = (ReadOnlySpan<char>)str[a..b];

Så här åtgärdar du överträdelser

Om du vill åtgärda ett brott mot den här regeln använder AsSpan du i stället för den Range-baserade indexeraren på strängen för att undvika att skapa onödiga datakopior.

public void TestMethod(string str)
{
    // The violation occurs
    ReadOnlySpan<char> slice = str[1..3];
    ...
}
public void TestMethod(string str)
{
    // The violation fixed with AsSpan extension method
    ReadOnlySpan<char> slice = str.AsSpan()[1..3];
    ...
}

Dricks

En kodkorrigering är tillgänglig för den här regeln i Visual Studio. Om du vill använda den placerar du markören på överträdelsen och trycker på Ctrl+. (punkt). Välj Använd AsSpan i stället för den Intervallbaserade indexeraren på en sträng i listan med alternativ som visas.

Code fix for CA1831 - Use AsSpan instead of Range-based indexers when appropriate

Du kan också lägga till en explicit gjutning för att undvika den här varningen.

public void TestMethod(string str)
{
    // The violation occurs.
    ReadOnlySpan<char> slice = str[1..3];
    ...
}
public void TestMethod(string str)
{
    // The violation avoided with explicit casting.
    ReadOnlySpan<char> slice = (ReadOnlySpan<char>)str[1..3];
    ...
}

När du ska ignorera varningar

Det är säkert att förhindra en överträdelse av den här regeln om du vill skapa en kopia.

Ignorera en varning

Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.

#pragma warning disable CA1831
// The code that's violating the rule is on this line.
#pragma warning restore CA1831

Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none i konfigurationsfilen.

[*.{cs,vb}]
dotnet_diagnostic.CA1831.severity = none

Om du vill inaktivera hela den här regelkategorin anger du allvarlighetsgraden för kategorin till none i konfigurationsfilen.

[*.{cs,vb}]
dotnet_analyzer_diagnostic.category-Performance.severity = none

Mer information finns i Så här utelämnar du kodanalysvarningar.

Se även