CA1878: Előnyben részesíti a ReadOnlySpan tulajdonságokat az olvasható tömbmezőkkel szemben

Property Érték
Szabályazonosító CA1878
Title A ReadOnlySpan tulajdonságok előnyben részesítve az olvasható tömbmezőket
Kategória Teljesítmény
A javítás törést okoz vagy nem okoz törést nem-törhető
Alapértelmezés szerint engedélyezve a .NET 11-ben Javaslatként
Alkalmazandó nyelvek C#

A probléma oka

A privát statikus írásvédett egydimenziós tömbmezők támogatott állandó értékeket tartalmaznak, és az összes megfigyelt használat biztonságosan újraírható egy ReadOnlySpan<T> tulajdonság használatához.

Szabály leírása

A statikus, olvasható tömbmezőkhöz felügyelt tömbfoglalás szükséges. Ha egy ReadOnlySpan<T> tulajdonság támogatott állandó adatokat ad vissza, a C#-fordító a felügyelt tömbök kiosztása nélkül csökkentheti az adatokat. A mező tulajdonsággal való cseréje csökkentheti a foglalásokat, miközben megőrzi az adatokhoz való írásvédett hozzáférést.

Az elemző a következő elemtípusokat támogatja:

  • bool, byteés sbyte minden alkalommal támogatott, amikor ReadOnlySpan<T> elérhető.
  • short, ushort, char, int, uint, float, longulong, és double csak akkor támogatott, ha a cél összeállítása közzéteszi a nyilvános statikus RuntimeHelpers.CreateSpan<T>(RuntimeFieldHandle) metódust. .NET 7- és újabb referenciaszerelvények teszik elérhetővé ezt a módszert.

Az elemző nem diagnosztizálja a , , nint, nuintszám típusú, tetszőleges szerkezetek vagy referenciatípusok tömbeitdecimal. Emellett nem diagnosztizál szaggatott tömböket vagy többdimenziós tömböket.

Szabálysértések kijavítása

Cserélje le a tömbmezőt egy kifejezés által testesített tulajdonságra, amely visszaadja a függvényt ReadOnlySpan<T>.

A kódjavítás újraírja a mező jogosult használati adatait. Támogatott AsSpan hívások esetén eltávolítja a redundáns hívásokat, vagy egyenértékű span műveletre cseréli a hívást, például Slice. A kódjavítás nem érhető el, ha nem tudja megőrizni minden használat szemantikáját.

Example

A következő kódrészlet a CA1878 megsértését mutatja be:

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

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

A következő kódrészlet kijavítja a szabálysértést:

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

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

Mikor kell letiltani a figyelmeztetéseket?

A figyelmeztetés mellőzése, ha szándékosan megőrzi a tömb identitását vagy módosíthatóságát, vagy ha az API-kompatibilitás megőrzése megköveteli, hogy a tag tömbmező maradjon. A szabály csak olyan privát statikus írásvédett mezőket jelent, amelyek megfigyelt használati adatai biztonságosan újraírhatók.

Figyelmeztetés mellőzése

Ha csak egyetlen szabálysértést szeretne letiltani, adjon hozzá előfeldolgozási irányelveket a forrásfájlhoz a szabály letiltásához és újbóli engedélyezéséhez.

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

Ha le szeretné tiltani egy fájl, mappa vagy projekt szabályát, állítsa annak súlyosságát none a konfigurációs fájlban.

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

További információ: Kódelemzési figyelmeztetések letiltása.

Lásd még