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 za běhu.
CA1805: Neinicializovat zbytečně 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 je volána metoda, která vytváří a vrací nový řetězec, ale tento nový řetězec se nikdy nepoužije, nebo metoda modelu COM (Component Object Model) či P/Invoke vrátí hodnotu HRESULT nebo kód chyby, který se nikdy nepoužije.
CA1810: Inicializujte statická pole referenčního typu přímo 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 interním třídám bez instance 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: Upřednostněte zubatá pole před vícerozměrnými poli Zubaté 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 metodu Equals a operátor == u hodnotových typů 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í. Aby pole zůstalo odolné proti manipulaci, musí vlastnost vrátit kopii pole. Uživatelé obvykle nebudou chápat nepříznivé dopady volání takové vlastnosti na výkon.
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: Odeberte prázdné finalizátory 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 Atribut NeutralResourcesLanguage informuje správce prostředků o jazyce, který byl použit k zobrazení prostředků neutrální jazykové verze pro sestavení. To zlepšuje výkon při vyhledávání prvního prostředku, který načítáte, a může zmenšit 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 Count/LongCount, pokud lze použít Any Byla použita metoda Count nebo LongCount, kde by byla metoda Any efektivnější.
CA1828: Nepoužívejte CountAsync/LongCountAsync, pokud je možné použít AnyAsync Byla použita metoda CountAsync nebo LongCountAsync, kde by byla metoda AnyAsync 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 striktně typovaná přetížení metod Append a Insert u 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: Je-li to vhodné, použijte u řetězce místo indexerů založených na rozsazích metodu AsSpan Při použití indexeru rozsahu v řetězci a implicitně přiřazování hodnoty k typu char ReadOnlySpan<bude použita metoda > místo Substring, což vytvoří kopii požadované části řetězce.Slice
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 na poli a při implicitním přiřazení hodnoty typu ReadOnlySpan<T> typu ReadOnlyMemory<T> se místo Slice použije metoda 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 poli a implicitním přiřazení hodnoty typu Span<T> nebo Memory<T> se místo Slice použije metoda GetSubArray, která vytvoří kopii požadované části pole.
CA1834: Pro řetězce s jedním znakem použijte StringBuilder.Append(char) StringBuilder má přetížení Append, které přijímá jako argument char. Upřednostňujte volání přetížení char pro zvýš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řijímá „Memory<Byte>“, a přetížení „WriteAsync“, které jako první argument přijímá „ReadOnlyMemory<Byte>“. Upřednostňujte volání přetížení pracujících s pamětí, která jsou efektivnější.
CA1836: Upřednostněte IsEmpty před Count, je-li k dispozici Upřednostněte IsEmpty vlastnost, která je efektivnější než Count, Lengthnebo Count<TSource>(IEnumerable<TSource>) určit, LongCount<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 parametrům StringBuilder pro P/Invoke Marshaling objektu StringBuilder vždy vytvoří nativní kopii vyrovnávací paměti, což při jedné operaci marshalingu vede k několika alokacím.
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: Upřednostňujte metody Dictionary.Contains Volání Contains u kolekce Keys nebo Values může být často dražší než volání ContainsKey nebo ContainsValue u samotného slovníku.
CA1842: Nepoužívejte funkci WhenAll s jedním úkolem Použití WhenAll s jednou úlohou může vést ke ztrátě výkonu. Počkejte na úkol nebo jej vraťte.
CA1843: Nepoužívejte metodu 'WaitAll' pro jednu úlohu Použití WaitAll s jednou úlohou může vést ke ztrátě výkonu. Místo toho vyčkejte na dokončení úlohy nebo ji vraťte.
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ři odvozování z třídy Stream přepište asynchronní metody založené na paměti. Pak implementujte metody založené na polích z hlediska metod založených na paměti.
CA1845: Použijte metodu 'string.Concat' založenou na typu Span Je efektivnější používat AsSpan a string.Concat namísto Substring a operátoru zřetězení.
CA1846: Upřednostněte AsSpan před Substring AsSpan je efektivnější než Substring. Substring provádí kopírování řetězce v čase O(n), zatímco AsSpan nikoli a má konstantní časovou náročnost. AsSpan také neprovádí žádné přidělení haldy.
CA1847: Použijte literál char pro vyhledávání jednoho znaku Používejte String.Contains(char) místo String.Contains(string) při hledání jednoho znaku.
CA1848: Použijte delegáty LoggerMessage Pro lepší výkon používejte delegáty LoggerMessage.
CA1849: Volání asynchronních metod v asynchronní metodě V metodě, která je již asynchronní, by se měly volat asynchronní verze jiných metod, pokud jsou k dispozici.
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ícenásobná enumerace kolekce IEnumerable Možné více výčtů IEnumerable kolekce. Zvažte použití implementace, která zabraňuje více výčtům.
CA1852: Interní typy by měly být zapečetěné Typ, který není přístupný mimo své sestavení a nemá v rámci něj žádné odvozené typy, není zapečetěný.
CA1853: Nepotřebné volání metody 'Dictionary.ContainsKey(key)' Dictionary.Remove(key) není třeba chránit pomocí Dictionary.ContainsKey(key). Dictionary<TKey,TValue>.Remove(TKey) již kontroluje, zda klíč existuje, a pokud neexistuje, nevyvolá výjimku.
CA1854: Preferujte metodu IDictionary.TryGetValue(TKey, out TValue) Upřednostňujte metodu TryGetValue před přístupem přes indexátor slovníku, kterému předchází kontrola 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() Je efektivnější volat Span<T>.Clear() než volat Span<T>.Fill(T) pro vyplnění prvků spanu 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 Je efektivnější volat String.StartsWith než volat String.IndexOf pro ověření, zda řetězec začíná zadanou 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 Když kód volá ToLower() nebo ToUpper() k provedení porovnání řetězců bez rozlišení velkých a malých písmen, provede se zbytečná alokace.
CA1863: Použijte CompositeFormat Chcete-li snížit náklady na formátování, ukládejte instanci CompositeFormat do mezipaměti a používejte ji jako argument pro String.Format nebo StringBuilder.AppendFormat.
CA1864: Preferujte metodu IDictionary.TryAdd(TKey, TValue) Jak Dictionary<TKey,TValue>.ContainsKey(TKey), tak Dictionary<TKey,TValue>.Add provádějí vyhledání, což je redundantní. Je efektivnější zavolat Dictionary<TKey,TValue>.TryAdd, které vrací bool, který určuje, zda byla hodnota přidána. TryAdd nepřepíše hodnotu klíče, pokud je klíč již k dispozici.
CA1865-CA1867: Použití přetížení char Přetížení pro typ char má lepší výkon než přetížení pro řetězec s jediným znakem.
CA1868: Zbytečné volání metody Contains u množin Jak ISet<T>.Add(T), tak ICollection<T>.Remove(T) provádějí vyhledání, takže je nadbytečné předtím volat ICollection<T>.Contains(T). Je efektivnější volat přímo Add(T) nebo Remove(T), které vrací logickou hodnotu udávající, zda byla položka přidána nebo odebrána.
CA1869: Ukládejte instance JsonSerializerOptions do mezipaměti a znovu je používejte 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 mají menší nároky na alokaci paměti než použití BitConverter.ToString v kombinaci s String.Replace ke nahrazení pomlček a String.ToLower.
CA1873: Vyhněte se potenciálně nákladnému protokolování Při zavolání metod protokolování se jejich argumenty vyhodnocují bez ohledu na to, jestli je povolená úroveň protokolování. To může vést k nákladovým operacím, a to i v případě, že se zpráva protokolu nezapíše. Pokud chcete dosáhnout lepšího výkonu, chraňte nákladné volání logování kontrolou IsEnabled nebo vzorem LoggerMessage.
CA1874: Použijte Regex.IsMatch Regex.IsMatch je jednodušší a rychlejší než Regex.Match(...).Success.
CA1875: Použijte výraz Regex.Count. Regex.Count je jednodušší a rychlejší než Regex.Matches(...).Count.
CA1877: Použijte přetížení Path.Combine nebo Path.Join Více po sobě jdoucích Path.Combine nebo Path.Join operací lze sloučit do jednoho volání pomocí přetížení, která přijímají více segmentů cesty.
CA1878: Upřednostněte vlastnosti ReadOnlySpan před poli polí jen pro čtení Privátní statické pole s konstantní maticí lze nahradit ReadOnlySpan<T> vlastností, aby kompilátor jazyka C# zabránil přidělení spravovaného pole.