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.
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.
Règles associées
- CA1832 : Utiliser AsSpan ou AsMemory à la place d’indexeurs basés sur Range pour obtenir la partie ReadOnlySpan ou ReadOnlyMemory d’un tableau
- CA1833 : Utiliser AsSpan ou AsMemory à la place d’indexeurs basés sur Range pour obtenir la partie Span ou Memory d’un tableau