Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Reguły wydajności obsługują biblioteki i aplikacje o wysokiej wydajności.
W tej sekcji
| Reguła | Opis |
|---|---|
| CA1802: Używaj literałów, gdy to właściwe | Pole jest zadeklarowane jako statyczne i tylko do odczytu (Shared i ReadOnly w języku Visual Basic) oraz inicjalizowane wartością, którą można obliczyć w czasie kompilacji. Ponieważ wartość przypisana do pola docelowego jest obliczana w czasie kompilacji, zmień deklarację na const (Const in Visual Basic), aby wartość była obliczana w czasie kompilacji zamiast w czasie wykonywania. |
| CA1805: Nie inicjuj niepotrzebnie | Środowisko uruchomieniowe platformy .NET inicjuje wszystkie pola typów referencyjnych wartościami domyślnymi przed wykonaniem konstruktora. W większości przypadków jawne inicjowanie pola do jego wartości domyślnej jest nadmiarowe, co zwiększa koszty konserwacji i może obniżyć wydajność (na przykład ze zwiększonym rozmiarem zestawu). |
| CA1806: Nie ignoruj wyników metod | Tworzony jest nowy obiekt, ale nigdy nie jest używany, albo wywoływana jest metoda, która tworzy i zwraca nowy ciąg znaków, lecz ten nowy ciąg nigdy nie jest używany, albo metoda Component Object Model (COM) lub P/Invoke zwraca wartość HRESULT lub kod błędu, które nigdy nie są używane. |
| CA1810: Inicjuj statyczne pola typu referencyjnego w deklaracji | Gdy typ deklaruje jawny konstruktor statyczny, kompilator just-in-time (JIT) dodaje sprawdzenie do każdej metody statycznej i konstruktora instancji tego typu, aby upewnić się, że konstruktor statyczny został wcześniej wywołany. Sprawdzenia konstruktora statycznego mogą obniżyć wydajność. |
| CA1812: Unikaj nieinstancjonowanych klas wewnętrznych | Instancja typu na poziomie zestawu nie jest tworzona przez kod zawarty w zestawie. |
| CA1813: Unikaj niezapieczętowanych atrybutów | Platforma .NET udostępnia metody pobierania atrybutów niestandardowych. Domyślnie te metody wyszukują hierarchie dziedziczenia atrybutu. Zapieczętowanie atrybutu eliminuje przeszukiwanie hierarchii dziedziczenia i może poprawić wydajność. |
| CA1814: Wybieraj tablice nieregularne zamiast wielowymiarowych | Nieregularna tablica to ta, której elementy są tablicami. Tablice tworzące elementy mogą mieć różne rozmiary, co może spowodować mniejsze marnowanie miejsca dla niektórych zestawów danych. |
| CA1815: Przesłoń metodę equals i operator równości dla typów wartości | Dla typów wartości dziedziczona implementacja metody Equals wykorzystuje bibliotekę Reflection i porównuje zawartość wszystkich pól. Refleksja jest kosztowna obliczeniowo, a sprawdzanie równości wszystkich pól może być niepotrzebne. Jeśli można się spodziewać, że użytkownicy będą porównywać lub sortować wystąpienia lub używać wystąpień jako kluczy tabel haszowanych, typ wartości powinien implementować Equals. |
| CA1819: Właściwości nie powinny zwracać tablic | Tablice zwracane przez właściwości nie są zabezpieczone przed zapisem, nawet jeśli właściwość jest tylko do odczytu. Aby zachować tablicę odporną na manipulacje, właściwość musi zwracać kopię tablicy. Zazwyczaj użytkownicy nie rozumieją, jaki negatywny wpływ na wydajność ma wywołanie takiej właściwości. |
| CA1820: Testuj obecność pustych ciągów przy użyciu długości ciągu | Porównywanie ciągów za pomocą właściwości String.Length lub metody String.IsNullOrEmpty jest znacznie szybsze niż użycie operatora Equals. |
| CA1821: Usuń puste finalizatory | Zawsze, gdy to możliwe, należy unikać finalizatorów ze względu na dodatkowy narzut wydajności związany ze śledzeniem czasu życia obiektu. Pusty finalizator generuje dodatkowe koszty bez żadnych korzyści. |
| CA1822: Oznaczaj składowe jako statyczne | Składowe, które nie uzyskują dostępu do danych wystąpienia ani nie wywołują metod wystąpienia, mogą być oznaczone jako statyczne (Shared w Visual Basic). Po oznaczeniu metod jako statyczne kompilator wygeneruje niewirtualne miejsca wywołania dla tych składowych. To może dać wymierny zysk wydajnościowy dla kodu wrażliwego na wydajność. |
| CA1823: Unikaj nieużywanych pól prywatnych | Zostały wykryte pola prywatne, które w zestawie nie są widoczne jako dostępne. |
| CA1824: Oznaczaj zestawy za pomocą atrybutu NeutralResourcesLanguageAttribute | Atrybut NeutralResourcesLanguage informuje menedżera zasobów o języku, który został użyty do wyświetlania zasobów neutralnej kultury dla zestawu. Poprawia to wydajność wyszukiwania pierwszego zasobu, który ładujesz, i może zmniejszyć zestaw roboczy. |
| CA1825: Unikaj alokacji tablic o zerowej długości | Inicjowanie tablicy o zerowej długości prowadzi do niepotrzebnej alokacji pamięci. Zamiast tego użyj statycznie alokowanej instancji pustej tablicy, wywołując Array.Empty. Alokacja pamięci jest współdzielona we wszystkich wywołaniach tej metody. |
| CA1826: Użyj właściwości zamiast metody Linq Enumerable | Enumerable Metoda LINQ została użyta dla typu, który obsługuje równoważną, bardziej wydajną właściwość. |
| CA1827: Nie używaj metod Count/LongCount, gdy można użyć Any | Count metoda lub LongCount została użyta, gdzie Any metoda byłaby bardziej wydajna. |
| CA1828: Nie używaj funkcji CountAsync/LongCountAsync, gdy można użyć narzędzia AnyAsync | CountAsync metoda lub LongCountAsync została użyta, gdzie AnyAsync metoda byłaby bardziej wydajna. |
| CA1829: Użyj właściwości Length/Count zamiast metody Enumerable.Count |
Count Metoda LINQ została użyta dla typu, który obsługuje równoważne, bardziej wydajne Length lub Count właściwości. |
| CA1830: Preferuj silnie typizowane przeciążenia metody Append i Insert w programie StringBuilder | Append i Insert zapewniają przeciążenia dla wielu typów innych niż System.String. Jeśli to możliwe, wybieraj przeciążenia ze ścisłym typowaniem zamiast używać metody ToString() i przeciążenia przyjmującego parametr typu string. |
| CA1831: Użyj narzędzia AsSpan zamiast indeksatorów opartych na zakresie dla ciągu, jeśli jest to konieczne | W przypadku używania indeksatora zakresu w ciągu i niejawnego przypisania wartości do typu char ReadOnlySpan<metoda > zostanie użyta zamiast Substring, co spowoduje utworzenie kopii żądanej częściSlice ciągu. |
| CA1832: Użyj klasy AsSpan lub AsMemory zamiast indeksatorów opartych na zakresie, aby uzyskać fragment ReadOnlySpan lub ReadOnlyMemory tablicy | W przypadku użycia indeksatora zakresu na tablicy i niejawnego przypisania wartości do typu ReadOnlySpan<T> lub ReadOnlyMemory<T> zostanie użyta metoda GetSubArray zamiast Slice, która tworzy kopię wskazanego fragmentu tablicy. |
| CA1833: Użyj AsSpan lub AsMemory zamiast indeksatorów zakresowych do uzyskiwania obiektu Span lub Memory reprezentującego fragment tablicy | Podczas używania indeksatora zakresu na tablicy i niejawnego przypisania wartości do typu Span<T> lub Memory<T> zostanie użyta metoda GetSubArray zamiast Slice, co spowoduje utworzenie kopii żądanego fragmentu tablicy. |
| CA1834: Użyj StringBuilder.Append(char) dla ciągów jednoznakowych |
StringBuilder ma przeciążenie Append, które przyjmuje char jako argument. Preferuj wywołanie przeciążenia char, aby zwiększyć wydajność. |
| CA1835: Preferuj przeciążenia oparte na typie „Memory” dla metod „ReadAsync” i „WriteAsync” | „Stream” ma przeciążenie „ReadAsync”, które jako pierwszy argument przyjmuje „Memory<Byte>”, oraz przeciążenie „WriteAsync”, które jako pierwszy argument przyjmuje „ReadOnlyMemory<Byte>”. Preferuj wywoływanie przeciążeń opartych na pamięci, które są bardziej wydajne. |
CA1836: Preferowane jest IsEmpty zamiast Count, gdy jest dostępne |
Należy preferować właściwość IsEmpty, która jest wydajniejsza niż Count, Length, Count<TSource>(IEnumerable<TSource>) lub LongCount<TSource>(IEnumerable<TSource>), aby określić, czy obiekt zawiera jakiekolwiek elementy. |
CA1837: Użyj Environment.ProcessId zamiast Process.GetCurrentProcess().Id |
Environment.ProcessId jest prostsza i szybsza niż Process.GetCurrentProcess().Id. |
CA1838: Unikaj parametrów StringBuilder w deklaracjach P/Invoke |
Marshalowanie elementu StringBuilder zawsze tworzy natywną kopię bufora, co skutkuje wielokrotnymi alokacjami podczas jednej operacji marshalowania. |
| CA1839: Użyj Environment.ProcessPath zamiast Process.GetCurrentProcess().MainModule.FileName |
Environment.ProcessPath jest prostsza i szybsza niż Process.GetCurrentProcess().MainModule.FileName. |
| CA1840: Użyj Environment.CurrentManagedThreadId zamiast Thread.CurrentThread.ManagedThreadId |
Environment.CurrentManagedThreadId jest bardziej kompaktowy i wydajny niż Thread.CurrentThread.ManagedThreadId. |
| CA1841: Preferuj słownik zawiera metody | Wywołanie Contains dla kolekcji Keys lub Values może być często bardziej kosztowne niż wywołanie ContainsKey lub ContainsValue na samym słowniku. |
| CA1842: Nie używaj 'WhenAll' z pojedynczym zadaniem | Użycie WhenAll z jednym zadaniem może spowodować utratę wydajności. Zamiast tego zaczekaj na zadanie lub zwróć je. |
| CA1843: Nie używaj funkcji "WaitAll" z jednym zadaniem | Użycie WaitAll z jednym zadaniem może spowodować utratę wydajności. Zamiast tego poczekaj lub zwróć zadanie. |
| CA1844: Podaj zastąpienia oparte na pamięci metod asynchronicznych podczas podklasowania "Stream" | Aby zwiększyć wydajność, zastąp metody asynchroniczne oparte na pamięci podczas podklasowania "Stream". Następnie zaimplementuj metody bazujące na tablicach w oparciu o metody bazujące na pamięci. |
| CA1845: Użyj metody „string.Concat” opartej na span | Bardziej wydajne jest użycie AsSpan i string.Concat zamiast Substring i operatora konkatenacji. |
CA1846: Preferuj użycie AsSpan zamiast Substring |
AsSpan jest wydajniejszy niż Substring.
Substring wykonuje kopiowanie łańcucha znaków w czasie O(n), podczas gdy AsSpan tego nie robi i ma stały koszt.
AsSpan nie wykonuje również żadnych alokacji sterty. |
| CA1847: Użyj literału typu char do wyszukiwania pojedynczego znaku | Użyj String.Contains(char) zamiast String.Contains(string) podczas wyszukiwania pojedynczego znaku. |
| CA1848: Użyj delegatów LoggerMessage | Aby uzyskać lepszą wydajność, użyj LoggerMessage delegatów. |
| CA1849: Wywoływanie metod asynchronicznych w przypadku metody asynchronicznej | W metodzie, która jest już asynchroniczna, wywołania innych metod powinny dotyczyć ich wersji asynchronicznych, w których istnieją. |
CA1850: Preferuj metodę statyczną HashData zamiast ComputeHash |
Bardziej wydajne jest użycie metody statycznej HashData niż tworzenie instancji HashAlgorithm i zarządzanie nią w celu wywołania ComputeHash. |
CA1851: Możliwe wiele wyliczeń kolekcji IEnumerable |
Możliwe wielokrotne wyliczenie kolekcji IEnumerable. Rozważ użycie implementacji, która pozwala uniknąć wielu wyliczeń. |
| CA1852: Zapieczętuj typy wewnętrzne | Typ, który nie jest dostępny poza zestawem i nie ma podtypów w ramach zestawu zawierającego zestaw, nie jest zapieczętowany. |
| CA1853: Niepotrzebne wywołanie elementu "Dictionary.ContainsKey(key)" | Nie ma potrzeby zabezpieczać Dictionary.Remove(key) za pomocą Dictionary.ContainsKey(key).
Dictionary<TKey,TValue>.Remove(TKey) już sprawdza, czy klucz istnieje i nie zgłasza go, jeśli nie istnieje. |
| CA1854: Preferuj metodę "IDictionary.TryGetValue(TKey, out TValue)" | Preferuj użycie „TryGetValue” zamiast dostępu przez indekser słownika zabezpieczonego sprawdzeniem „ContainsKey”. Element "ContainsKey" i indeksator wyszukują klucz, więc użycie polecenia "TryGetValue" pozwala uniknąć dodatkowego wyszukiwania. |
| CA1855: Użyj opcji Span<T>. Clear() zamiast Span<T>. Fill() | Bardziej wydajne jest wywołanie metody Span<T>.Clear() niż wywołanie metody Span<T>.Fill(T) w celu wypełnienia elementów spanu wartością domyślną. |
| CA1856: Nieprawidłowe użycie atrybutu ConstantExpected | Atrybut ConstantExpectedAttribute nie jest poprawnie stosowany w parametrze. |
| CA1857: Parametr oczekuje stałej w celu uzyskania optymalnej wydajności | Nieprawidłowy argument jest przekazywany do parametru, który jest oznaczony adnotacją .ConstantExpectedAttribute |
| CA1858: Użyj polecenia StartsWith zamiast indexOf | Wywołanie String.StartsWith jest bardziej wydajne niż wywołanie String.IndexOf w celu sprawdzenia, czy ciąg zaczyna się od danego prefiksu. |
| CA1859: Używaj konkretnych typów, gdy to możliwe, aby zwiększyć wydajność | Kod używa typów interfejsów lub typów abstrakcyjnych, co prowadzi do niepotrzebnych wywołań interfejsu lub wywołań wirtualnych. |
| CA1860: Unikaj używania metody rozszerzenia "Enumerable.Any()" | Bardziej wydajne i bardziej przejrzyste jest użycie Length, Count lub IsEmpty (jeśli to możliwe) niż wywoływanie metody Enumerable.Any, aby sprawdzić, czy kolekcja zawiera jakiekolwiek elementy. |
| CA1861: Unikaj tablic stałych jako argumentów | Tablice stałe przekazywane jako argumenty nie są ponownie używane, co oznacza obciążenie związane z wydajnością. Rozważ przeniesienie ich do pól „static readonly”, aby poprawić wydajność. |
| CA1862: Użyj przeciążeń metody "StringComparison", aby wykonać porównania ciągów bez uwzględniania wielkości liter | Gdy kod wywołuje ToLower() lub ToUpper(), aby wykonać porównanie łańcuchów bez rozróżniania wielkości liter, wykonywana jest niepotrzebna alokacja. |
| CA1863: Użyj formatu złożonego | Aby zmniejszyć koszt formatowania, przechowuj w pamięci podręcznej i użyj wystąpienia CompositeFormat jako argumentu dla String.Format lub StringBuilder.AppendFormat. |
| CA1864: Preferuj metodę "IDictionary.TryAdd(TKey, TValue)" | Zarówno Dictionary<TKey,TValue>.ContainsKey(TKey) jak i Dictionary<TKey,TValue>.Add wykonują wyszukiwanie, co jest zbędne. Bardziej efektywne jest wywołanie metody Dictionary<TKey,TValue>.TryAdd, która zwraca bool, wskazujący, czy wartość została dodana.
TryAdd nie zastępuje wartości klucza, jeśli klucz jest już obecny. |
| CA1865-CA1867: Użyj przeciążenia char | Przeciążenie dla typu char jest wydajniejsze w przypadku ciągu zawierającego pojedynczy znak. |
| CA1868: Niepotrzebne wywołanie funkcji "Contains" dla zestawów | Zarówno ISet<T>.Add(T), jak i ICollection<T>.Remove(T) wykonują wyszukiwanie, więc wcześniejsze wywołanie ICollection<T>.Contains(T) jest zbędne. Bardziej wydajne jest bezpośrednie wywołanie Add(T) lub Remove(T), które zwraca wartość logiczną wskazującą, czy element został dodany, czy usunięty. |
| CA1869: Buforowanie i ponowne używanie obiektów JsonSerializerOptions | Użycie lokalnej instancji JsonSerializerOptions do serializacji lub deserializacji może znacznie obniżyć wydajność aplikacji, jeśli kod wykonuje się wielokrotnie, ponieważ System.Text.Json wewnętrznie przechowuje w pamięci podręcznej metadane związane z serializacją w udostępnionej instancji. |
| CA1870: Użyj buforowanego wystąpienia „SearchValues” | Użycie buforowanego SearchValues<T> wystąpienia jest bardziej wydajne niż przekazywanie wartości bezpośrednio do "IndexOfAny" lub "ContainsAny". |
| CA1871: Nie przekazuj struktury dopuszczającej wartość null do metody „ArgumentNullException.ThrowIfNull” | Wyrażenie "ArgumentNullException.ThrowIfNull" akceptuje obiekt "object", więc przekazanie struktury dopuszczających wartość null może spowodować, że wartość zostanie w polu. |
| CA1872: Preferuj „Convert.ToHexString” i „Convert.ToHexStringLower” zamiast łańcuchów wywołań opartych na „BitConverter.ToString” | Użyj Convert.ToHexString lub Convert.ToHexStringLower podczas kodowania bajtów na reprezentację szesnastkową w postaci ciągu znaków. Te metody są bardziej wydajne i bardziej oszczędne pod względem alokacji niż użycie BitConverter.ToString w połączeniu z String.Replace do zastępowania myślników i String.ToLower. |
| CA1873: Unikaj potencjalnie kosztownego logowania | Kiedy metody rejestrowania są wywoływane, ich argumenty są obliczane niezależnie od tego, czy poziom rejestrowania jest włączony. Może to spowodować wykonanie kosztownych operacji nawet wtedy, gdy komunikat dziennika nie zostanie zapisany. Aby uzyskać lepszą wydajność, należy chronić kosztowne wywołania rejestrowania poprzez sprawdzenie z IsEnabled lub użycie wzorca LoggerMessage. |
| CA1874: Użyj metody 'Regex.IsMatch' |
Regex.IsMatch jest prostsza i szybsza niż Regex.Match(...).Success. |
| CA1875: Użyj 'Regex.Count' |
Regex.Count jest prostsza i szybsza niż Regex.Matches(...).Count. |
| CA1877: Użyj przeciążeń "Path.Combine" lub "Path.Join" | Wiele kolejnych Path.Combine lub Path.Join operacji można skonsolidować w jedno wywołanie przy użyciu przeciążeń, które akceptują wiele segmentów ścieżki. |
| CA1878: Preferuj właściwości ReadOnlySpan dla pól tablicy tylko do odczytu | Prywatne statyczne pole tylko do odczytu będące stałą tablicową można zastąpić właściwością ReadOnlySpan<T>, dzięki czemu kompilator języka C# może uniknąć alokacji tablicy zarządzanej. |
Współpracuj z nami w serwisie GitHub
Źródło tej zawartości można znaleźć w witrynie GitHub, gdzie można również tworzyć i przeglądać problemy i żądania ściągnięcia. Więcej informacji znajdziesz w naszym przewodniku dla współtwórców.