Teljesítményszabályok

A teljesítményszabályok támogatják a nagy teljesítményű kódtárakat és alkalmazásokat.

Ebben a szakaszban

Szabály Leírás
CA1802: Szükség esetén literálok használata Egy mező statikusnak és csak olvashatónak van deklarálva (a Visual Basicben Shared és ReadOnly), és olyan értékkel van inicializálva, amely fordítási időben kiszámítható. Mivel a megcélzott mezőhöz rendelt érték fordításkor megbízható, módosítsa a deklarációt const (Const in Visual Basic) mezőre, hogy az érték fordítási időpontban legyen kiszámítva, és ne futásidőben.
CA1805: Ne inicializálja feleslegesen A .NET-futtatókörnyezet a konstruktor futtatása előtt inicializálja a referenciatípusok összes mezőjét az alapértelmezett értékükre. A legtöbb esetben egy mező explicit inicializálása az alapértelmezett értékre redundáns, ami növeli a karbantartási költségeket, és csökkentheti a teljesítményt (például nagyobb szerelvényméret esetén).
CA1806: Ne hagyja figyelmen kívül a metódus eredményeit A rendszer létrehoz egy új objektumot, de soha nem használ, vagy meghív egy új sztringet létrehozó és visszaadó metódust, és soha nem használja az új sztringet, vagy a komponensobjektum-modell (COM) vagy a P/Invoke metódus soha nem használt HRESULT vagy hibakódot ad vissza.
CA1810: Referenciatípus statikus mezőinek inicializálása beágyazottan Amikor egy típus explicit statikus konstruktort deklarál, a just-in-time (JIT) fordító egy ellenőrzést ad hozzá a típus minden egyes statikus metódusához és példánykonstruktorához, hogy meggyőződjön arról, hogy a statikus konstruktort korábban meghívták. A statikus konstruktor-ellenőrzések csökkenthetik a teljesítményt.
CA1812: A nem telepített belső osztályok elkerülése A szerelvényszintű típus egy példányát nem a szerelvényben lévő kód hozza létre.
CA1813: A nem hozzárendelt attribútumok elkerülése A .NET metódusokat biztosít az egyéni attribútumok lekéréséhez. Ezek a metódusok alapértelmezés szerint az attribútumöröklési hierarchiában keresnek. Az attribútum zárolása megszünteti a keresést az öröklési hierarchián keresztül, és javíthatja a teljesítményt.
CA1814: Az egyenetlen tömbök előnyben részesítése a többdimenziós tömbökkel szemben A szaggatott tömb olyan tömb, amelynek elemei tömbök. Az elemeket alkotó tömbök különböző méretűek lehetnek, ami egyes adathalmazok számára kevesebb felesleges helyet eredményezhet.
CA1815: Bírálja felül az Equals metódust és az egyenlőségoperátort az értéktípusokon Az értéktípusok esetében az Egyenlőség öröklött implementációja a Tükröződés kódtárat használja, és összehasonlítja az összes mező tartalmát. A tükröződés számításilag költséges, és az egyenlőség minden mezőjének összehasonlítása szükségtelen lehet. Ha arra számít, hogy a felhasználók összehasonlítják vagy rendezik a példányokat, vagy kivonattáblakulcsként használják a példányokat, az értéktípusnak egyenlőségeket kell implementálnia.
CA1819: A tulajdonságok ne adjanak vissza tömböt A tulajdonságok által visszaadott tömbök nem írásvédettek, még akkor sem, ha a tulajdonság írásvédett. Annak érdekében, hogy a tömb módosítással szemben védett maradjon, a tulajdonságnak a tömb másolatát kell visszaadnia. A felhasználók általában nem fogják megérteni az ilyen tulajdonság meghívásának kedvezőtlen teljesítménybeli következményeit.
CA1820: Üres karakterláncok ellenőrzése a karakterlánc hossza alapján A sztringek összehasonlítása a String.Length tulajdonság vagy a String.IsNullOrEmpty metódus használatával jelentősen gyorsabb, mint az Egyenlők használata.
CA1821: Üres véglegesítők eltávolítása Amikor csak lehetséges, kerülje a véglegesítőket az objektum élettartamának nyomon követésével járó többletterhelés miatt. Az üres döntősök többletterhelést okoznak előny nélkül.
CA1822: Tagok megjelölése statikusként Azok a tagok, amelyek nem férnek hozzá a példányadatokhoz, és nem hívnak meg példánymetódusokat, statikusnak jelölhetők meg (a Visual Basicben Shared). Miután a metódusokat statikussá jelöli, a fordító nem virtuális hívási helyeket hoz létre ezekhez a tagokhoz. Ez mérhető teljesítménynövekedést biztosíthat a teljesítményérzékeny kódhoz.
CA1823: A nem használt privát mezők elkerülése A rendszer olyan privát mezőket észlelt, amelyekhez az assemblyben láthatóan nem férnek hozzá.
CA1824: Szerelvények megjelölése a NeutralResourcesLanguageAttribute használatával A NeutralResourcesLanguage attribútum tájékoztatja a Resource Managert arról a nyelvről, amely egy szerelvény semleges kultúrájának erőforrásainak megjelenítésére szolgál. Ez javítja az első betölthető erőforrás keresési teljesítményét, és csökkentheti a munkakészletet.
CA1825: A nulla hosszúságú tömbfoglalások elkerülése A nulla hosszúságú tömb inicializálása szükségtelen memóriafoglaláshoz vezet. Ehelyett használja a statikusan allokált üres tömbpéldányt a(z) Array.Empty hívásával. A memóriafoglalás a metódus összes meghívása között meg van osztva.
CA1826: Tulajdonság használata a Linq Enumerable metódus helyett Enumerable A LINQ metódust olyan típuson használták, amely egy egyenértékű, hatékonyabb tulajdonságot támogat.
CA1827: Ne használja a Count/LongCount függvényt, ha bármelyik használható Count vagy LongCount olyan módszert használtak, ahol Any a módszer hatékonyabb lenne.
CA1828: Ne használja a CountAsync/LongCountAsync parancsot, ha az AnyAsync használható CountAsync vagy LongCountAsync olyan módszert használtak, ahol AnyAsync a módszer hatékonyabb lenne.
CA1829: Az Enumerable.Count metódus helyett használja a Length/Count tulajdonságot Count A LINQ metódust egy egyenértékű, hatékonyabb Length vagy Count tulajdonságot támogató típuson használták.
CA1830: A StringBuilder esetében részesítse előnyben a szigorúan típusos Append és Insert metódustúlterheléseket Append és Insert túlterheltségeket biztosít a System.Stringen kívül több típushoz is. Ha lehetséges, a ToString() és a karakterlánc-alapú túlterhelés helyett inkább a szigorúan típusos túlterheléseket használja.
CA1831: Ha szükséges, tartományalapú indexelők helyett AsSpan használata sztringekhez Ha egy sztringen tartományindexelőt használ, és az értéket implicit módon egy ReadOnlySpan<char> típusnak adja át, akkor a(z) Substring metódus lesz használatban a(z) Slice helyett, amely a sztring kért részéről másolatot készít.
CA1832: Tartományalapú indexelők helyett AsSpan vagy AsMemory használata a tömb ReadOnlySpan vagy ReadOnlyMemory részének lekéréséhez Ha egy tömbön tartományindexelőt használ, és az értéket implicit módon egy ReadOnlySpan<T> vagy ReadOnlyMemory<T> típushoz rendeli hozzá, akkor a rendszer a GetSubArray metódust használja a Slice helyett, amely a tömb kért részéről másolatot készít.
CA1833: Tartományalapú indexelők helyett AsSpan vagy AsMemory használata tömb span vagy memória részének lekéréséhez Ha egy tömbön tartományindexelést használ, és az értéket implicit módon egy Span<T> vagy Memory<T> típushoz rendeli, akkor a rendszer a(z) Slice helyett a(z) GetSubArray metódust használja, amely a tömb kért részéről másolatot készít.
CA1834: A StringBuilder.Append(char) használata egyetlen karakterből álló sztringekhez A(z) StringBuilder rendelkezik egy olyan Append túlterheléssel, amelynek argumentuma egy char. A teljesítmény javítása érdekében részesítse előnyben a(z) char túlterhelés hívását.
CA1835: A "ReadAsync" és a "WriteAsync" memóriaalapú túlterheléseinek előnyben részesítése A "Stream" egy "ReadAsync" túlterheléssel rendelkezik, amely első argumentumként egy "Memória<bájtot>" vesz fel, és egy "WriteAsync" túlterhelést, amely első argumentumként egy "ReadOnlyMemory<Byte>"-t vesz fel. Inkább hívja meg a memóriaalapú túlterheléseket, amelyek hatékonyabbak.
CA1836: Ha elérhető, részesítse előnyben a(z) IsEmpty elemet a(z) Count helyett Részesítse előnyben a(z) IsEmpty tulajdonságot, amely hatékonyabb, mint a(z) Count, Length, Count<TSource>(IEnumerable<TSource>) vagy LongCount<TSource>(IEnumerable<TSource>), annak megállapításához, hogy az objektum tartalmaz-e bármilyen elemet.
CA1837: A(z) Environment.ProcessId használata Process.GetCurrentProcess().Id helyett Environment.ProcessId egyszerűbb és gyorsabb, mint Process.GetCurrentProcess().Ida .
CA1838: A P/Invokes paramétereinek elkerülése StringBuilder A(z) StringBuilder marshallingja mindig létrehozza a natív puffer egy másolatát, ami egyetlen marshalling művelet során több memóriafoglalást eredményez.
CA1839: Használja a(z) Environment.ProcessPath elemet a(z) Process.GetCurrentProcess().MainModule.FileName helyett Environment.ProcessPath egyszerűbb és gyorsabb, mint Process.GetCurrentProcess().MainModule.FileNamea .
CA1840: Az Environment.CurrentManagedThreadId használata a Thread.CurrentThread.ManagedThreadId helyett Environment.CurrentManagedThreadId kompaktabb és hatékonyabb, mint Thread.CurrentThread.ManagedThreadIda .
CA1841: Részesítse előnyben a Dictionary.Contains metódusokat A(z) Keys vagy Values gyűjteményen a(z) Contains meghívása gyakran költségesebb lehet, mint a(z) ContainsKey vagy ContainsValue közvetlen meghívása magán a szótáron.
CA1842: Ne használja az "WhenAll" műveletet egyetlen tevékenységgel A(z) WhenAll egyetlen feladattal történő használata teljesítménycsökkenést okozhat. Várjon vagy adja vissza a feladatot.
CA1843: Ne használja a "WaitAll" műveletet egyetlen tevékenységgel A WaitAll egyetlen feladattal történő használata teljesítménycsökkenéshez vezethet. Várjon vagy adja vissza a feladatot.
CA1844: Az aszinkron metódusok memóriaalapú felülbírálásának biztosítása a Stream alosztályozása során A teljesítmény javítása érdekében felülbírálja a memóriaalapú aszinkron metódusokat a Stream alosztályozása során. Ezután implementálja a tömbalapú metódusokat a memóriaalapú metódusok tekintetében.
CA1845: A span-alapú „string.Concat” használata Hatékonyabb a AsSpan és a string.Concat használata a Substring és az összefűzési operátor helyett.
CA1846: A(z) AsSpan előnyben részesítése a(z) Substring helyett AsSpan hatékonyabb, mint Substringa . Substring egy O(n) karakterlánc-másolást végez, míg AsSpan nem, és állandó költségű. AsSpan sem végez halomfoglalást.
CA1847: Karakterkonstans használata egyetlen karakterkereséshez Egyetlen karakter keresésekor a(z) String.Contains(string) helyett használja a(z) String.Contains(char) elemet.
CA1848: A LoggerMessage delegáltjainak használata A jobb teljesítmény érdekében használja a LoggerMessage meghatalmazottakat.
CA1849: Aszinkron metódusok meghívása aszinkron metódusokban Egy már eleve aszinkron metódusban más metódusok hívásainál azok aszinkron változatát kell használni, ha létezik ilyen.
CA1850: A(z) ComputeHash helyett a statikus HashData metódus használata ajánlott Hatékonyabb a statikus HashData metódust használni, mint létrehozni és kezelni egy HashAlgorithm-példányt a ComputeHash meghívásához.
CA1851: A gyűjtemény lehetséges több enumerálása IEnumerable A gyűjtemény lehetséges több enumerációja IEnumerable . Érdemes lehet olyan implementációt használni, amely elkerüli a több enumerálást.
CA1852: Belső típusok zárolása Az a típus, amely nem érhető el a szerelvényen kívül, és nem tartalmaz altípusokat a szerelvényen belül, nincs lezárva.
CA1853: A(z) „Dictionary.ContainsKey(key)” fölösleges hívása Nincs szükség arra, hogy a(z) Dictionary.Remove(key) elemet a(z) Dictionary.ContainsKey(key) elemmel védje. Dictionary<TKey,TValue>.Remove(TKey) már ellenőrzi, hogy a kulcs létezik-e, és nem dob kivételt, ha az nem létezik.
CA1854: Az "IDictionary.TryGetValue(TKey, out TValue)" metódus használata A "TryGetValue"-t előnyben részesítse a szótár-indexelő hozzáféréssel szemben, amelyet egy "ContainsKey" ellenőrzés véd. Az "ContainsKey" és az indexelő is megkeresi a kulcsot, így a "TryGetValue" használata elkerüli a további kereséseket.
CA1855: A Span<T>.Fill() helyett használja a Span<T>.Clear() metódust A span elemeinek alapértelmezett értékkel való kitöltéséhez hatékonyabb a(z) Span<T>.Clear() meghívása, mint a(z) Span<T>.Fill(T) meghívása.
CA1856: A ConstantExpected attribútum helytelen használata Az ConstantExpectedAttribute attribútum nincs megfelelően alkalmazva egy paraméterre.
CA1857: A paraméter állandót vár az optimális teljesítményhez Érvénytelen argumentumot ad át a rendszer egy jegyzettel ellátott paraméternek ConstantExpectedAttribute.
CA1858: A StartsWith használata IndexOf helyett A String.StartsWith hívása hatékonyabb, mint a String.IndexOf hívása annak ellenőrzésére, hogy egy karakterlánc megadott előtaggal kezdődik-e.
CA1859: Ha lehetséges, használjon konkrét típusokat a jobb teljesítmény érdekében A kód felülettípusokat vagy absztrakt típusokat használ, ami szükségtelen felületi hívásokhoz vagy virtuális hívásokhoz vezet.
CA1860: Kerülje az "Enumerable.Any()" bővítménymetódus használatát Hatékonyabb és egyértelműbb a Length, Count vagy IsEmpty használata (ha lehetséges), mint a Enumerable.Any meghívása annak megállapítására, hogy egy gyűjteménytípus tartalmaz-e elemeket.
CA1861: Az állandó tömbök argumentumként való elkerülése Az argumentumként átadott állandó tömbök nem lesznek újra felhasználhatók, ami teljesítményterhelést jelent. A teljesítmény javítása érdekében érdemes lehet ezeket 'static readonly' mezőkbe áthelyezni.
CA1862: A(z) „StringComparison” metódustúlterhelések használata a kis- és nagybetűket figyelmen kívül hagyó karakterlánc-összehasonlítások végrehajtásához Amikor a kód a ToLower() vagy a ToUpper() hívásával kis- és nagybetűket nem megkülönböztető sztring-összehasonlítást végez, szükségtelen foglalás történik.
CA1863: A(z) „CompositeFormat” használata A formázási költségek csökkentése érdekében gyorsítótárazzon és használjon egy CompositeFormat példányt a String.Format vagy a StringBuilder.AppendFormat argumentumaként.
CA1864: Az "IDictionary.TryAdd(TKey, TValue)" metódus használata Mind a Dictionary<TKey,TValue>.ContainsKey(TKey), mind a Dictionary<TKey,TValue>.Add keresést hajt végre, ami redundáns. Hatékonyabb a(z) Dictionary<TKey,TValue>.TryAdd meghívása, amely egy bool értéket ad vissza, jelezve, hogy az érték hozzá lett-e adva vagy sem. TryAdd nem írja felül a kulcs értékét, ha a kulcs már létezik.
CA1865-CA1867: Karakter túlterhelés használata A char paramétert használó túlterhelés jobb teljesítményt nyújt egyetlen karakterből álló sztring esetén.
CA1868: A „Contains” szükségtelen meghívása halmazok esetén Mind a ISet<T>.Add(T), mind a ICollection<T>.Remove(T) végez keresést, ezért felesleges előzetesen meghívni a ICollection<T>.Contains(T) elemet. Hatékonyabb közvetlenül a Add(T) vagy a Remove(T) meghívása, amely logikai értékkel jelzi, hogy az elem hozzá lett-e adva vagy el lett-e távolítva.
CA1869: A JsonSerializerOptions példányainak gyorsítótárazása és újrafelhasználása A szerializáláshoz vagy deszerializáláshoz használt helyi példány JsonSerializerOptions jelentősen csökkentheti az alkalmazás teljesítményét, ha a kód többször fut, mivel a System.Text.Json belsőleg gyorsítótárazza a szerializációval kapcsolatos metaadatokat a megadott példányba.
CA1870: Használjon gyorsítótárazott „SearchValues” példányt Egy gyorsítótárazott SearchValues<T> példány használata hatékonyabb, mint az értékek közvetlen átadása az 'IndexOfAny' vagy a 'ContainsAny' számára.
CA1871: Ne adjon át null értékű nullable struktúrát az ArgumentNullException.ThrowIfNull metódusnak Az „ArgumentNullException.ThrowIfNull” egy „object” típust fogad el, ezért egy null értéket is felvevő struktúra átadásakor az érték dobozolásra kerülhet.
CA1872: Részesítse előnyben a(z) „Convert.ToHexString” és „Convert.ToHexStringLower” elemet a „BitConverter.ToString” alapú hívásláncokkal szemben A bájtok hexadecimális karakterlánc-reprezentációvá kódolásakor használja a Convert.ToHexString vagy a Convert.ToHexStringLower elemet. Ezek a módszerek hatékonyabbak és allokációbarátabbak, mint a BitConverter.ToString és String.Replace kombinációjának használata a kötőjelek és a String.ToLower lecserélésére.
CA1873: A potenciálisan költséges naplózás elkerülése A naplózási metódusok meghívásakor a rendszer az argumentumokat attól függetlenül kiértékeli, hogy engedélyezve van-e a naplózási szint. Ez költséges műveleteket eredményezhet még akkor is, ha a naplóüzenet nem lesz megírva. A jobb teljesítmény érdekében védd meg a drága naplózási hívásokat egy ellenőrzéssel a IsEnabled-hoz, vagy használd a LoggerMessage mintát.
CA1874: Használja a "Regex.IsMatch"-et Regex.IsMatch egyszerűbb és gyorsabb, mint Regex.Match(...).Successa .
CA1875: Használja a 'Regex.Count' kifejezést Regex.Count egyszerűbb és gyorsabb, mint Regex.Matches(...).Counta .
CA1877: "Path.Combine" vagy "Path.Join" túlterhelések használata Több egymást követő Path.Combine vagy Path.Join művelet összecsukható egyetlen hívásba több útvonalszegmenst elfogadó túlterheléssel.
CA1878: Előnyben részesíti a ReadOnlySpan tulajdonságokat az olvasható tömbmezőkkel szemben Egy privát statikus, csak olvasható konstans tömbmező lecserélhető egy ReadOnlySpan<T> tulajdonságra, így a C#-fordító elkerülheti egy felügyelt tömb lefoglalását.