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 , Length nebo 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.Concat místo Substring operátor zřetězení. |
CA1846: Raději než AsSpan Substring |
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.StartsWith String.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 , Count nebo 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.Format StringBuilder.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. |
Spolupracujte s námi na GitHubu
Zdroj tohoto obsahu najdete na GitHubu, kde můžete také vytvářet a kontrolovat problémy a žádosti o přijetí změn. Další informace najdete v našem průvodci pro přispěvatele.