CA1832: 配列の ReadOnlySpan または ReadOnlyMemory 部分を取得するために、範囲ベースのインデクサーの代わりに AsSpan または AsMemory を使用します
プロパティ | 値 |
---|---|
ルール ID | CA1832 |
Title | 配列の ReadOnlySpan または ReadOnlyMemory 部分を取得するために、範囲ベースのインデクサーの代わりに AsSpan または AsMemory を使用します |
[カテゴリ] | パフォーマンス |
修正が中断ありか中断なしか | なし |
.NET 8 では既定で有効 | 提案として |
原因
配列に対して範囲インデクサーを使用し、その値を ReadOnlySpan<T> または ReadOnlyMemory<T> 型に暗黙的に割り当てている場合。
規則の説明
Span<T> の範囲インデクサーは Slice 操作をコピーしません。 ただし、配列に対する範囲インデクサーの場合、Slice の代わりにメソッド GetSubArray が使用されます。これにより、配列の要求された部分のコピーが生成されます。 通常、ReadOnlySpan<T> または ReadOnlyMemory<T> 値として暗黙的に使用される場合、このコピーは不要です。 コピーが意図されない場合は、AsSpan または AsMemory メソッドを使用して不要なコピーを回避します。 コピーが意図される場合は、最初にローカル変数に割り当てるか、明示的なキャストを追加します。
アナライザーでは、範囲インデクサー操作の結果に対して暗黙的なキャストが使用される場合のみ報告します。
検出する
暗黙的な変換:
ReadOnlySpan<SomeT> slice = arr[a..b];
ReadOnlyMemory<SomeT> slice = arr[a..b];
検出しない
明示的な変換:
ReadOnlySpan<SomeT> slice = (ReadOnlySpan<SomeT>)arr[a..b];
ReadOnlyMemory<SomeT> slice = (ReadOnlyMemory<SomeT>)arr[a..b];
違反の修正方法
この規則の違反を修正するには、AsSpan または AsMemory 拡張メソッドを使用して、不要なデータ コピーの作成を回避します。
class C
{
public void TestMethod(byte[] arr)
{
// The violation occurs for both statements below
ReadOnlySpan<byte> tmp1 = arr[0..2];
ReadOnlyMemory<byte> tmp3 = arr[5..8];
...
}
}
class C
{
public void TestMethod(byte[] arr)
{
// The violations fixed with AsSpan or AsMemory accordingly
ReadOnlySpan<byte> tmp1 = arr.AsSpan()[0..2];
ReadOnlyMemory<byte> tmp3 = arr.AsMemory()[5..8];
...
}
}
ヒント
Visual Studio では、この規則に対するコード修正を使用できます。 これを使用するには、違反にカーソルを置き、Ctrl+. (ピリオド) を押します。 表示されるオプションの一覧から [配列に範囲ベースのインデクサーの代わりに AsSpan を使用します] を選択します。
明示的なキャストを追加することで、この警告を回避することもできます。
class C
{
public void TestMethod(byte[] arr)
{
// The violation occurs
ReadOnlySpan<byte> tmp1 = arr[0..2];
ReadOnlyMemory<byte> tmp3 = arr[5..8];
...
}
}
class C
{
public void TestMethod(byte[] arr)
{
// The violation fixed with explicit casting
ReadOnlySpan<byte> tmp1 = (ReadOnlySpan<byte>)arr[0..2];
ReadOnlyMemory<byte> tmp3 = (ReadOnlyMemory<byte>)arr[5..8];
...
}
}
どのようなときに警告を抑制するか
コピーを作成する場合は、この規則の違反を抑制できます。
警告を抑制する
単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。
#pragma warning disable CA1832
// The code that's violating the rule is on this line.
#pragma warning restore CA1832
ファイル、フォルダー、またはプロジェクトの規則を無効にするには、構成ファイルでその重要度を none
に設定します。
[*.{cs,vb}]
dotnet_diagnostic.CA1832.severity = none
詳細については、「コード分析の警告を抑制する方法」を参照してください。
関連規則
- CA1831: 該当する場合、文字列に範囲ベースのインデクサーの代わりに AsSpan を使用します
- CA1833: 配列の Span または Memory 部分を取得するために、範囲ベースのインデクサーの代わりに AsSpan または AsMemory を使用します
関連項目
.NET