Pravidla výkonu

Pravidla výkonu podporují vysoce výkonné knihovny a aplikace.

V této části

Pravidlo Popis
CA1802: Použijte literály, kde je to vhodné Pole je deklarováno jako statické a jen pro čtení (Shared a ReadOnly v jazyce Visual Basic) a inicializuje se hodnotou, která je v době kompilace kompuovatelná. Vzhledem k tomu, že hodnota přiřazená cílovému poli je v době kompilace kompuovatelná, změňte deklaraci na pole const (Const v jazyce Visual Basic), aby se hodnota vypočítávala v době kompilace místo v době běhu.
CA1805: Zbytečně neicializovat Modul runtime .NET inicializuje všechna pole referenčních typů na výchozí hodnoty před spuštěním konstruktoru. Ve většině případů je explicitní inicializace pole na výchozí hodnotu redundantní, což zvyšuje náklady na údržbu a může snížit výkon (například se zvýšenou velikostí sestavení).
CA1806: Neignorujte výsledky metody Vytvoří se nový objekt, ale nikdy se nepoužije nebo metoda, která vytvoří a vrátí nový řetězec, a nový řetězec se nikdy nepoužije, nebo metoda COM (Component Object Model) nebo P/Invoke vrátí HRESULT nebo kód chyby, který se nikdy nepoužívá.
CA1810: Inicializujte odkazový typ statického pole vloženě Pokud typ deklaruje explicitní statický konstruktor, kompilátor just-in-time (JIT) ke každé statické metodě a konstruktoru instance tohoto typu přidá kontrolu, zda již byl dříve statický konstruktor zavolán. Kontroly statického konstruktoru mohou snížit výkon.
CA1812: Vyhněte se nevytvořeným instancím vnitřních tříd Instance typu na úrovni sestavení není vytvořena kódem v sestavení.
CA1813: Vyhněte se nezapečetěným atributům .NET poskytuje metody pro načítání vlastních atributů. Ve výchozím nastavení tyto metody prohledávají hierarchii dědičnosti atributů. Zapečetění atributu eliminuje prohledávání hierarchie dědičnosti a může zlepšit výkon.
CA1814: Preferujte vícenásobná pole více než multidimenzionální Vícenásobné pole je pole, jehož prvky jsou pole. Pole, která tvoří prvky, můžou mít různé velikosti, což může vést k menšímu plýtvání místem pro některé sady dat.
CA1815: Přepište rovná se a operátor rovnosti na hodnotových typech Pro hodnotové typy používá zděděná implementace metody Equals knihovnu reflexe a porovnává obsah všech polí. Reflexe je výpočetně náročná a porovnání rovnosti všech polí může být zbytečné. Očekáváte-li, že uživatelé budou porovnávat nebo třídit instance či je používat jako klíče zatřiďovací tabulky, měl by typ hodnoty implementovat metodu Equals.
CA1819: Vlastnosti by neměly vracet pole Pole vrácená vlastnostmi nejsou chráněna proti zápisu, i když je vlastnost určena jen pro čtení. Abyste pole ochránili před změnou, musí vlastnost vrátit kopii tohoto pole. Uživatelé obvykle nebudou rozumět nepříznivým výkonnostním důsledkům volání těchto vlastností.
CA1820: Testujte prázdné řetězce pomocí délky řetězce Porovnání řetězců pomocí vlastnosti String.Length nebo metody String.IsNullOrEmpty je výrazně rychlejší než při použití metody Equals.
CA1821: Odstraňte prázdné finalizační metody Kdykoli je to možné, vyhněte se použití finalizačních metod kvůli dodatečným nárokům na výkon spojeným se sledováním životního cyklu objektu. Prázdný finalizátor přináší dodatečnou režii bez jakékoli výhody.
CA1822: Označte členy jako statické Členy, kteří nepřistupují k datům instance nebo metodám volání instance, lze označit jako statické (sdílené v jazyce Visual Basic). Po označení metod jako statických bude kompilátor generovat těmto členům nevirtuální místa volání. Tím lze dosáhnout měřitelného zisku výkonu pro výkonově citlivý kód.
CA1823: Vyhněte se nepoužitým privátním polím Byla zjištěna soukromá pole, která v rámci sestavení zjevně nejsou přístupná.
CA1824: Označte sestavení pomocí atributu NeutralResourcesLanguageAttribute NeutralResourcesLanguage atribut informuje Resource Manager jazyka, který byl použit k zobrazení prostředků neutrální jazykové verze sestavení. To zlepšuje výkon vyhledávání při prvním získání prostředků a může zmenšit vaši pracovní sadu.
CA1825: Vyhněte se přidělování polí nulové délky Inicializace pole nulové délky vede k zbytečnému přidělení paměti. Místo toho použijte staticky přidělenou prázdnou instanci pole voláním Array.Empty. Přidělení paměti se sdílí napříč všemi vyvoláním této metody.
CA1826: Místo metody Linq Enumerable použijte vlastnost Enumerable Metoda LINQ byla použita u typu, který podporuje ekvivalentní, efektivnější vlastnost.
CA1827: Nepoužívejte Počet/LongCount, pokud lze použít libovolnou možnost Count nebo LongCount byla použita metoda, ve Any které by byla metoda efektivnější.
CA1828: Nepoužívejte CountAsync/LongCountAsync, pokud je možné použít AnyAsync CountAsync nebo LongCountAsync byla použita metoda, ve AnyAsync které by byla metoda efektivnější.
CA1829: Místo metody Enumerable.Count použijte vlastnost Length/Count. Count Metoda LINQ byla použita u typu, který podporuje ekvivalentní, efektivnější Length nebo Count vlastnost.
CA1830: Preferujte přetížení metody Append a Insert silného typu v StringBuilderu Append a Insert poskytují přetížení pro více typů mimo System.String. Pokud je to možné, upřednostněte přetížení silného typu před použitím ToString() a přetížení založené na řetězci.
CA1831: Místo indexerů založených na rozsahu použijte pro řetězec asSpan, pokud je to vhodné Při použití indexeru rozsahu v řetězci a implicitně přiřazování hodnoty k typu char ReadOnlySpan<bude použita metoda Substring místo Slice, což vytvoří kopii požadované části řetězce.>
CA1832: Místo indexerů založených na rozsahu použijte AsSpan nebo AsMemory pro získání části pole ReadOnlySpan nebo ReadOnlyMemory. Při použití indexeru rozsahu v matici a implicitně přiřazování hodnoty k ReadOnlySpan<T> nějakému typu ReadOnlyMemory<T> se použije metoda místo Slice, GetSubArray která vytvoří kopii požadované části pole.
CA1833: Místo indexerů založených na rozsahu použijte AsSpan nebo AsMemory pro získání části pole Span nebo Memory. Při použití indexeru rozsahu v matici a implicitně přiřazování hodnoty k Span<T> nějakému typu Memory<T> se použije metoda místo Slice, GetSubArray která vytvoří kopii požadované části pole.
CA1834: Pro řetězce s jedním znakem použijte StringBuilder.Append(char) StringBuilderAppend má přetížení, které jako argument přebíráchar. Preferujte volání char přetížení za účelem zlepšení výkonu.
CA1835: Preferujte přetížení založená na paměti pro ReadAsync a WriteAsync. Stream má přetížení ReadAsync, které jako první argument přebírá bajt> paměti<a přetížení WriteAsync, které jako první argument přebírá bajt ReadOnlyMemory<Byte>. Raději volají přetížení založená na paměti, což je efektivnější.
CA1836: Preferovat IsEmpty před Count dostupností Upřednostněte IsEmpty vlastnost, která je efektivnější než Count, Lengthnebo LongCount<TSource>(IEnumerable<TSource>) určit, Count<TSource>(IEnumerable<TSource>) zda objekt obsahuje nebo neobsahuje žádné položky.
CA1837: Používejte Environment.ProcessId místo Process.GetCurrentProcess().Id Environment.ProcessId je jednodušší a rychlejší než Process.GetCurrentProcess().Id.
CA1838: Vyhněte se StringBuilder parametrům volání nespravovaného kódu Přiřazování StringBuilder vždy vytvoří nativní kopii vyrovnávací paměti, což vede k několika přidělením pro jednu operaci seřazování.
CA1839: Místo Process.GetCurrentProcess() použijte Environment.ProcessPath. MainModule.FileName Environment.ProcessPath je jednodušší a rychlejší než Process.GetCurrentProcess().MainModule.FileName.
CA1840: Použijte Environment.CurrentManagedThreadId místo Thread.CurrentThread.ManagedThreadId. Environment.CurrentManagedThreadId je kompaktnější a efektivnější než Thread.CurrentThread.ManagedThreadId.
CA1841: Prefer Dictionary Contains metody Volání Contains na Keys kolekci nebo volání Values může být často dražší než volání ContainsKey nebo ContainsValue samotný slovník.
CA1842: Nepoužívejte funkci WhenAll s jedním úkolem Použití WhenAll s jednou úlohou může vést ke ztrátě výkonu. Nečekejte nebo vraťte úkol.
CA1843: Nepoužívejte waitAll s jednou úlohou Použití WaitAll s jednou úlohou může vést ke ztrátě výkonu. Nečekejte nebo vraťte úkol.
CA1844: Poskytnutí přepisů asynchronních metod založených na paměti při podtřídě Stream Pokud chcete zvýšit výkon, přepište asynchronní metody založené na paměti při podtřídě Stream. Pak implementujte metody založené na polích z hlediska metod založených na paměti.
CA1845: Použijte řetězec založený na rozsahu. Concat' Je efektivnější používat AsSpan a string.Concatmísto Substring operátor zřetězení.
CA1846: Raději než AsSpanSubstring AsSpan je efektivnější než Substring. Substring provádí kopii řetězce O(n), zatímco AsSpan ne a má konstantní náklady. AsSpan také neprovádí žádné přidělení haldy.
CA1847: Použití literálu char pro jednoznační vyhledávání Používejte string.Contains(char) místo string.Contains(string) při hledání jednoho znaku.
CA1848: Použijte delegáty LoggerMessage Pro zvýšení výkonu LoggerMessage použijte delegáty.
CA1849: Volání asynchronních metod v asynchronní metodě V metodě, která je již asynchronní, by volání jiných metod měla být jejich asynchronní verze, kde existují.
CA1850: Upřednostněte statickou HashData metodu před ComputeHash Je efektivnější použít statickou HashData metodu při vytváření a správě HashAlgorithm instance pro volání ComputeHash.
CA1851: Možné více výčtů IEnumerable kolekce Možné více výčtů IEnumerable kolekce. Zvažte použití implementace, která zabraňuje více výčtům.
CA1852: Zapečetění interních typů Typ, který není přístupný mimo sestavení a neobsahuje žádné podtypy v jeho obsahujícím sestavení, není zapečetěn.
CA1853: Nepotřebné volání Dictionary.ContainsKey(klíč) Není potřeba hlídat Dictionary.Remove(key)Dictionary.ContainsKey(key). Dictionary<TKey,TValue>.Remove(TKey) už zkontroluje, jestli klíč existuje, a pokud neexistuje, vyvolá se.
CA1854: Preferujte metodu IDictionary.TryGetValue(TKey, out TValue) Upřednostňujte hodnotu TryGetValue před indexerem slovníku, který je chráněný kontrolou ContainsKey. "ContainsKey" i indexer vyhledá klíč, takže použitím metody TryGetValue se vyhnete dalšímu vyhledávání.
CA1855: Použijte span<T>. Clear() místo span<T>. Fill() Volání je efektivnější než volání Span<T>.Clear()Span<T>.Fill(T) k vyplnění prvků rozsahu výchozí hodnotou.
CA1856: Nesprávné použití atributu ConstantExpected Atribut ConstantExpectedAttribute není u parametru použit správně.
CA1857: Parametr očekává konstantu pro optimální výkon. Neplatný argument se předá parametru, který je opatřen poznámkami ConstantExpectedAttribute.
CA1858: Místo IndexOf použijte StartsWith Volání je efektivnější než volání String.StartsWithString.IndexOf , abyste zkontrolovali, jestli řetězec začíná danou předponou.
CA1859: Pro zvýšení výkonu používejte konkrétní typy, pokud je to možné Kód používá typy rozhraní nebo abstraktní typy, což vede k zbytečným voláním rozhraní nebo virtuálním voláním.
CA1860: Nepoužívejte metodu rozšíření Enumerable.Any() Je efektivnější a jasnější použít Length, Countnebo IsEmpty (pokud je to možné) než volat Enumerable.Any , aby bylo možné určit, zda typ kolekce má nějaké prvky.
CA1861: Vyhněte se konstantním polím jako argumentům Konstantní pole předaná jako argumenty se znovu nepoužívají, což znamená režii na výkon. Pokud chcete zvýšit výkon, zvažte jejich extrahování do polí se statickým čtením.
CA1862: Použití přetížení metody StringComparison k provádění porovnání řetězců bez rozlišování velkých a malých písmen Při volání ToLower() kódu nebo ToUpper() provedení porovnání řetězců bez rozlišování velkých a malých písmen se provede zbytečné přidělení.
CA1863: Použijte CompositeFormat Chcete-li snížit náklady na formátování, mezipaměť a použít CompositeFormat instanci jako argument nebo String.FormatStringBuilder.AppendFormat.
CA1864: Preferujte metodu IDictionary.TryAdd(TKey, TValue) Obojí Dictionary<TKey,TValue>.ContainsKey(TKey) a Dictionary<TKey,TValue>.Add proveďte vyhledávání, které je redundantní. Volání je efektivnější Dictionary<TKey,TValue>.TryAdd, což vrátí bool indikující, jestli byla hodnota přidána nebo ne. TryAdd nepřepíše hodnotu klíče, pokud je klíč již k dispozici.
CA1865-CA1867: Použití přetížení char Přetížení znaku je lepším výkonem přetížení řetězce s jedním znakem.
CA1868: Nepotřebné volání "Contains" pro sady Obojí ISet<T>.Add(T) a ICollection<T>.Remove(T) proveďte vyhledávání, které předem zpřístupňuje volání ICollection<T>.Contains(T) . Volání nebo Remove(T) přímé volání Add(T) je efektivnější, což vrátí logickou hodnotu označující, jestli byla položka přidána nebo odebrána.
CA1869: Mezipaměti a opakované použití instancí JsonSerializerOptions Použití místní instance JsonSerializerOptions serializace nebo deserializace může podstatně snížit výkon vaší aplikace, pokud se váš kód spustí vícekrát, protože System.Text.Json interně ukládá metadata související se serializací do zadané instance.
CA1870: Použití instance SearchValues uložené v mezipaměti Použití instance uložené SearchValues<T> v mezipaměti je efektivnější než přímé předávání hodnot do indexOfAny nebo ContainsAny.
CA1871: Nepředávejte strukturu s možnou hodnotou null do argumentu ArgumentNullException.ThrowIfNull ArgumentNullException.ThrowIfNull přijímá objekt object, takže předání struktury s možnou hodnotou null může způsobit, že se hodnota zařadí do pole.
CA1872: Upřednostněte convert.ToHexString a Convert.ToHexStringLower u řetězců volání založených na BitConverter.ToString Použijte Convert.ToHexString nebo Convert.ToHexStringLower při kódování bajtů na šestnáctkové řetězcové vyjádření. Tyto metody jsou efektivnější a přívětivější než použití BitConverter.ToString v kombinaci s String.Replace nahrazením pomlček a String.ToLower.