CA1831: 該当する場合、文字列に範囲ベースのインデクサーの代わりに AsSpan を使用します

プロパティ
ルール ID CA1831
Title 該当する場合、文字列に範囲ベースのインデクサーの代わりに AsSpan を使用します
[カテゴリ] パフォーマンス
修正が中断ありか中断なしか なし
.NET 8 では既定で有効 警告として

原因

範囲インデクサーは文字列で使用され、値は暗黙的に ReadOnlySpan<char> に割り当てられます。

規則の説明

この規則は、文字列に対して範囲インデクサーを使用し、それを span 型に割り当てるときに適用されます。 Span<T> に対する範囲インデクサーはコピーを実行しない Slice 操作ですが、文字列での範囲インデクサーの場合、メソッド SubstringSlice の代わりに使用されます。 これにより、文字列の要求された部分のコピーが生成されます。 通常、ReadOnlySpan<T> または ReadOnlyMemory<T> 値として暗黙的に使用される場合、このコピーは不要です。 コピーが意図されない場合は、AsSpan メソッドを使用して不要なコピーを回避します。 コピーが意図される場合は、最初にローカル変数に割り当てるか、明示的なキャストを追加します。 アナライザーでは、範囲インデクサー操作の結果に対して暗黙的なキャストが使用される場合のみ報告します。

検出する

暗黙的な変換:

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

検出しない

明示的な変換:

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

違反の修正方法

この規則の違反を修正するには、文字列に対して Range ベースのインデクサーの代わりに AsSpan を使用して、不要なデータ コピーが作成されないようにします。

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

ヒント

Visual Studio では、この規則に対するコード修正を使用できます。 これを使用するには、違反にカーソルを置き、Ctrl+. (ピリオド) を押します。 表示されるオプションの一覧から [文字列に範囲ベースのインデクサーの代わりに AsSpan を使用します] を選択します。

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

この警告を回避するために、明示的なキャストを追加することもできます。

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

どのようなときに警告を抑制するか

コピーを作成する場合は、この規則の違反を抑制できます。

警告を抑制する

単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。

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

ファイル、フォルダー、またはプロジェクトのルールを無効にするには、構成ファイルでその重要度を none に設定します。

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

規則のこのカテゴリ全体を無効にするには、構成ファイルでカテゴリの重要度を none に設定します。

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

詳細については、「コード分析の警告を抑制する方法」を参照してください。

関連項目