次の方法で共有


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

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

原因

範囲インデクサーは文字列で使用され、値は暗黙的に 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];

違反の修正方法

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

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 を使用します] を選択します。

CA1831 - 該当時には範囲ベースのインデクサーの代わりに AsSpan を使用するためのコード修正

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

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

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

関連項目