CA1831 : Utiliser AsSpan à la place d’indexeurs basés sur Range pour une chaîne si approprié

Propriété Value
Identificateur de la règle CA1831
Titre Utiliser AsSpan à la place d’indexeurs basés sur Range pour une chaîne si approprié
Catégorie Performances
Le correctif est cassant ou non cassant Sans rupture
Activé par défaut dans .NET 8 Comme avertissement

Cause

Un indexeur de plage est utilisé sur une chaîne, et la valeur est implicitement affectée à ReadOnlySpan<char>.

Description de la règle

Cette règle se déclenche lorsque vous utilisez un indexeur de plage sur une chaîne et que vous l’affectez à un type d’étendue. L’indexeur de plage sur un Span<T> est une opération Slice sans copie, mais pour l’indexeur de plage sur une chaîne, la méthode Substring est utilisée à la place de Slice. Cela produit une copie de la partie demandée de la chaîne. Cette copie est généralement inutile lorsqu’elle est implicitement utilisée comme valeur ReadOnlySpan<T> ou ReadOnlyMemory<T>. Si une copie n’est pas prévue, utilisez la méthode AsSpan pour éviter la copie inutile. Si la copie est prévue, affectez-la d’abord à une variable locale ou ajoutez un cast explicite. L’analyseur signale uniquement lorsqu’un cast implicite est utilisé sur le résultat de l’opération d’indexeur de plage.

Détecte

Conversion implicite :

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

Ne détecte pas

Conversion explicite :

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

Comment corriger les violations

Pour corriger une violation de cette règle, utilisez AsSpan à la place de l’indexeur basé sur Range sur la chaîne afin d’éviter de créer des copies de données inutiles.

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];
    ...
}

Conseil

Un correctif de code est disponible pour cette règle dans Visual Studio. Pour l’utiliser, positionnez le curseur sur la violation et appuyez sur Ctrl+. (point). Choisissez Utiliser AsSpan au lieu de l’indexeur basé sur une plage sur une chaîne dans la liste des options qui est présentée.

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

Vous pouvez également ajouter un cast explicite pour éviter cet avertissement.

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];
    ...
}

Quand supprimer les avertissements

Vous pouvez supprimer sans risque une violation de cette règle si la création d’une copie est prévue.

Supprimer un avertissement

Si vous voulez supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver et réactiver la règle.

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

Pour désactiver la règle sur un fichier, un dossier ou un projet, définissez sa gravité sur none dans le fichier de configuration.

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

Pour désactiver la catégorie entière des règles, définissez la gravité de la catégorie sur none dans le fichier de configuration.

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

Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.

Voir aussi