Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
| 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éssbyteminden alkalommal támogatott, amikor ReadOnlySpan<T> elérhető. -
short,ushort,char,int,uint,float,longulong, ésdoublecsak 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.