CA1878:偏好 ReadOnly Span 屬性勝過只讀陣列欄位

Property 價值觀
規則識別碼 約1878年
Title 偏好 ReadOnlySpan 屬性勝過只讀陣列欄位
Category 績效
修正是破壞性或非破壞性 不中斷
預設啟用於 .NET 11 作為建議
適用語言 C#

原因

私有的靜態只讀一維陣列欄位包含支援的常數值,且所有觀察到的使用方式都可以安全地重寫為使用屬性 ReadOnlySpan<T>

規則描述

靜態唯讀陣列欄位需要管理陣列配置。 當某 ReadOnlySpan<T> 屬性回傳支援的常數資料時,C# 編譯器可以在不分配管理陣列的情況下降低資料。 將欄位替換為屬性可以減少配置,同時保留唯讀存取權限。

分析儀支援以下元件類型:

分析器不會診斷陣列decimalnintnuint列舉型別、任意結構體或參考型別。 它也無法診斷鋸齒陣列或多維陣列。

如何修正違規

將陣列欄位替換為一個帶有表達式的性質,該性質會返回 ReadOnlySpan<T>

程式碼修正會重寫該欄位的合格用法。 對於支援 AsSpan 呼叫,它會移除冗餘呼叫,或以等效的張距運算取代該呼叫,例如 Slice。 當程式碼無法保留每種用法的語意時,就不會提供這個修正。

範例

以下代碼摘要顯示違反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;
}

隱藏警告的時機

如果你故意保留陣列的身份或可變性,或為了維持 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

如需詳細資訊,請參閱 如何隱藏程式碼分析警告

參見