CA1878: Salt okunur dizi alanları yerine ReadOnlySpan özelliklerini tercih edin

Property Değer
Kural Kimliği CA1878
Title Salt okunur dizi alanları yerine ReadOnlySpan özelliklerini tercih edin
Kategori Performans
Düzeltme kırılgan mı yoksa sağlam mı Non-breaking
.NET 11'de varsayılan olarak etkindir Öneri olarak
Geçerli diller C#

Cause

Özel statik salt okunur tek boyutlu dizi alanı desteklenen sabit değerler içerir ve gözlemlenen tüm kullanımlar bir ReadOnlySpan<T> özelliği kullanmak için güvenle yeniden yazılabilir.

Kural açıklaması

Statik salt okunur dizi alanı, yönetilen bir dizi ayırması gerektirir. Bir ReadOnlySpan<T> özellik desteklenen sabit verileri döndürdüğünde, C# derleyicisi yönetilen dizi ayırmadan verileri düşürebilir. Alanı bir özellik ile değiştirmek, verilere salt okunur erişimi korurken ayırmaları azaltabilir.

Çözümleyici aşağıdaki öğe türlerini destekler:

  • bool, byteve sbyte kullanılabilir olduğunda ReadOnlySpan<T> desteklenir.
  • short, ushort, char, int, uint, , float, long, , ulongve double yalnızca hedef derleme genel statik RuntimeHelpers.CreateSpan<T>(RuntimeFieldHandle) yöntemi kullanıma sunarken desteklenir. .NET 7 ve üzeri başvuru derlemeleri bu yöntemi kullanıma sunar.

Çözümleyici , , , nintnuintsabit listesi türleri, rastgele yapılar veya başvuru türleri dizilerini decimaltanılamaz. Ayrıca, pürüzlü dizileri veya çok boyutlu dizileri tanılamaz.

İhlalleri düzeltme

dizi alanını döndüren ReadOnlySpan<T>ifade gövdeli bir özellik ile değiştirin.

Kod düzeltmesi, alanın uygun kullanımlarını yeniden yazar. Desteklenen AsSpan çağrılar için, yedekli bir çağrıyı kaldırır veya çağrıyı gibi Sliceeşdeğer bir span işlemiyle değiştirir. Kod düzeltmesi, her kullanımın semantiğini koruyamıyorsa sunulmaz.

Example

Aşağıdaki kod parçacığı CA1878 ihlalini gösterir:

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

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

Aşağıdaki kod parçacığı ihlali düzeltir:

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

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

Uyarıların ne zaman bastırılması gerekiyor?

Dizinin kimliğini veya değiştirilebilirliğini bilerek koruyorsanız veya API uyumluluğunu korumak için üyenin bir dizi alanı olarak kalmasını gerektiriyorsa uyarıyı gizleme. Kural yalnızca gözlemlenen kullanımları güvenli bir şekilde yeniden yazabilen özel statik salt okunur alanları bildirir.

Uyarıyı gizleme

Yalnızca tek bir ihlali engellemek istiyorsanız, kuralı devre dışı bırakmak ve sonra yeniden etkinleştirmek için kaynak dosyanıza ön işlemci yönergeleri ekleyin.

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

Bir dosya, klasör veya projenin kuralını devre dışı bırakmak için, none önem derecesini olarak ayarlayın.

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

Daha fazla bilgi için bkz. Kod analizi uyarılarını gizleme.

Ayrıca bakınız