Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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. |
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.