| Property | 價值觀 |
|---|---|
| 規則識別碼 | 約1878年 |
| Title | 偏好 ReadOnlySpan 屬性勝過只讀陣列欄位 |
| Category | 績效 |
| 修正是破壞性或非破壞性 | 不中斷 |
| 預設啟用於 .NET 11 | 作為建議 |
| 適用語言 | C# |
原因
私有的靜態只讀一維陣列欄位包含支援的常數值,且所有觀察到的使用方式都可以安全地重寫為使用屬性 ReadOnlySpan<T> 。
規則描述
靜態唯讀陣列欄位需要管理陣列配置。 當某 ReadOnlySpan<T> 屬性回傳支援的常數資料時,C# 編譯器可以在不分配管理陣列的情況下降低資料。 將欄位替換為屬性可以減少配置,同時保留唯讀存取權限。
分析儀支援以下元件類型:
-
boolbyte、 、 以及sbyte只要有資料就被支援ReadOnlySpan<T>。 -
shortushort、、char、longintfloatulonguint,double僅在目標編譯公開靜態RuntimeHelpers.CreateSpan<T>(RuntimeFieldHandle)方法公開時才被支援。 .NET 7 及之後的參考組件也揭露了此方法。
分析器不會診斷陣列decimal、nintnuint列舉型別、任意結構體或參考型別。 它也無法診斷鋸齒陣列或多維陣列。
如何修正違規
將陣列欄位替換為一個帶有表達式的性質,該性質會返回 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
如需詳細資訊,請參閱 如何隱藏程式碼分析警告。