CA1878: 読み取り時の配列フィールドよりも ReadOnlySpan プロパティを優先する

財産 価値
ルール識別子 CA1878
タイトル 読み取り時の配列フィールドよりも ReadOnlySpan プロパティを優先する
カテゴリ パフォーマンス
修正が破壊的か非破壊的か Non-breaking
.NET 11 で既定で有効 一つの提案として
該当する言語 C#

原因

プライベート静的読み取り専用の 1 次元配列フィールドには、サポートされている定数値が含まれており、観察されたすべての使用法は、 ReadOnlySpan<T> プロパティを使用するように安全に書き換えることができます。

ルールの説明

静的な読み取り専用配列フィールドには、マネージド配列の割り当てが必要です。 ReadOnlySpan<T> プロパティがサポートされている定数データを返す場合、C# コンパイラはマネージド配列を割り当てずにデータを小さくできます。 フィールドをプロパティに置き換えると、データへの読み取り専用アクセスを維持しながら割り当てを減らすことができます。

アナライザーでは、次の要素の種類がサポートされています。

  • boolbyte、および sbyte は、 ReadOnlySpan<T> が使用可能な場合は常にサポートされます。
  • shortushortcharintuintfloatlongulong、および double は、ターゲット コンパイルでパブリック静的 RuntimeHelpers.CreateSpan<T>(RuntimeFieldHandle) メソッドが公開されている場合にのみサポートされます。 .NET 7 以降の参照アセンブリでは、このメソッドが公開されています。

アナライザーは、 decimalnintnuint、列挙型、任意の構造体、または参照型の配列を診断しません。 ジャグ配列や多次元配列も診断されません。

違反を修正する方法

配列フィールドを、 ReadOnlySpan<T>を返す式形式のプロパティに置き換えます。

コード修正は、フィールドの有効な使用法を書き換えます。 サポートされている AsSpan 呼び出しの場合、冗長な呼び出しを削除するか、呼び出しを同等のスパン操作 ( Slice など) に置き換えます。 コード修正は、すべての使用状況のセマンティクスを保持できない場合には提供されません。

Example

次のコード スニペットは、CA1878 の違反を示しています。

class CA1878ViolationExample
{
    private static readonly byte[] Prefix = new byte[] { 0x50, 0x4B, 0x03, 0x04 };

    public static ReadOnlySpan<byte> GetPrefix() => Prefix;
}

次のコード スニペットは、違反を修正します。

class CA1878FixExample
{
    private static ReadOnlySpan<byte> Prefix => new byte[] { 0x50, 0x4B, 0x03, 0x04 };

    public static ReadOnlySpan<byte> GetPrefix() => Prefix;
}

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

配列の ID または変更可能性を意図的に保持する場合、または API の互換性を維持するためにメンバーが配列フィールドのままである必要がある場合は、警告を抑制します。 このルールは、監視された使用状況を安全に書き換えることができるプライベート静的読み取り専用フィールドのみを報告します。

警告を抑制する

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

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

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

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

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

こちらも参照ください