Use AsSpan instead of Range-based indexers for string when appropriate
Use AsSpan instead of Range-based indexers for string when appropriate
Microsoft docsDescription
This rule fires when you use a range-indexer on a string and assign it to a span type. The range indexer on a System.Span1 is a non-copying System.Span1.Slice operation, but for the range indexer on a string, the method System.String.Substring will be used instead of System.Span1.Slice. This produces a copy of the requested portion of the string. This copy is usually unnecessary when it's implicitly used as a System.ReadOnlySpan1 or System.ReadOnlyMemory`1 value. If a copy isn't intended, use the System.MemoryExtensions.AsSpan method to avoid the unnecessary copy. If the copy is intended, either assign it to a local variable first or add an explicit cast. The analyzer only reports when an implicit cast is used on the result of the range indexer operation.
### Detects
Implicit conversion:
ReadOnlySpan<char> slice = str[a..b];
### Does not detect
Explicit conversion:
ReadOnlySpan<char> slice = (ReadOnlySpan<char>)str[a..b];
Cause
A range-indexer is used on a string and the value is implicitly assigned to ReadOnlySpan<char>.
How to fix violations
To fix a violation of this rule, use System.MemoryExtensions.AsSpan instead of the System.Range-based indexer on the string to avoid creating unnecessary data copies. A code fix is available for this rule in Visual Studio. To use it, position the cursor on the violation and press <kbd>Ctrl</kbd>+<kbd>.</kbd> (period). Choose Use AsSpan instead of the Range-based indexer on a string from the list of options that's presented. !Code fix for CA1831 - Use AsSpan instead of Range-based indexers when appropriate
You can also add an explicit cast to avoid this warning.
Example
public void TestMethod(string str)
{
// The violation occurs
ReadOnlySpan<char> slice = str[1..3];
...
}When to suppress
It's safe to suppress a violation of this rule if creating a copy is intended.