Reguły niezawodności
Reguły niezawodności obsługują bibliotekę i niezawodność aplikacji, takie jak prawidłowe użycie pamięci i wątków. Reguły niezawodności obejmują:
Reguła | Opis |
---|---|
CA2000: Usuwanie obiektów przed utratą zakresu | Ze względu na to, że może wystąpić wyjątkowe zdarzenie, które uniemożliwi uruchomienie finalizatora obiektu, obiekt powinien zostać jawnie usunięty, zanim wszystkie odwołania do niego są poza zakresem. |
CA2002: Nie blokuj obiektów ze słabą tożsamością | Mówi się, że obiekt ma słabą tożsamość, gdy można uzyskać bezpośredni dostęp do niej w granicach domeny aplikacji. Wątek, który próbuje uzyskać blokadę obiektu, który ma słabą tożsamość, może zostać zablokowany przez drugi wątek w innej domenie aplikacji, który ma blokadę na tym samym obiekcie. |
CA2007: Nie oczekuj bezpośrednio zadania | Metoda asynchroniczna oczekuje bezpośrednioTask. |
CA2008: Nie twórz zadań bez przekazywania TaskScheduler | Operacja tworzenia lub kontynuacji zadania używa przeciążenia metody, która nie określa parametru TaskScheduler. |
CA2009: Nie należy wywoływać elementu ToImmutableCollection na wartości ImmutableCollection |
ToImmutable metoda została niepotrzebnie wywołana w niezmiennej kolekcji z System.Collections.Immutable przestrzeni nazw. |
CA2011: Nie przypisuj właściwości w setter | Właściwość została przypadkowo przypisana do własnej zestawu dostępu. |
CA2012: Poprawnie użyj wartościTasks | WartościZadania zwracane z wywołań składowych mają być bezpośrednio oczekiwane. Próby wielokrotnego korzystania z elementu ValueTask lub bezpośredniego uzyskania dostępu do wyniku, zanim wiadomo, że zostanie ukończone, mogą spowodować wyjątek lub uszkodzenie. Ignorowanie takiej wartościTask jest prawdopodobnie wskazaniem usterki funkcjonalnej i może obniżyć wydajność. |
CA2013: Nie należy używać metody ReferenceEquals z typami wartości | Podczas porównywania wartości przy użyciu System.Object.ReferenceEquals, jeśli objA i objB są typami wartości, są one w polu przed przekazaniem ich do metody ReferenceEquals. Oznacza to, że nawet jeśli zarówno objA, jak i objB reprezentują to samo wystąpienie typu wartości, metoda ReferenceEquals jednak zwraca wartość false. |
CA2014: Nie używaj pętli stackalloc w pętlach. | Miejsce na stos przydzielone przez stosalloc jest zwalniane tylko na końcu wywołania bieżącej metody. Użycie go w pętli może spowodować niezwiązane wzrost stosu i ostateczne warunki przepełnienia stosu. |
CA2015: Nie należy definiować finalizatorów typów pochodzących z klasy MemoryManager<T> | Dodanie finalizatora do typu pochodzącego z MemoryManager<T> może pozwolić na zwolnienie pamięci, gdy jest ona nadal używana przez Span<T>. |
CA2016: Przekaż parametr CancellationToken do metod, które przyjmują jeden | Przekaż CancellationToken parametr do metod, które przyjmują jeden, aby upewnić się, że powiadomienia o anulowaniu operacji są prawidłowo propagowane, lub przekaż jawnie CancellationToken.None , aby wskazać celowo nie propagację tokenu. |
CA2017: Niezgodność liczby parametrów | Liczba parametrów podanych w szablonie komunikatu rejestrowania nie jest zgodna z liczbą nazwanych symboli zastępczych. |
CA2018: Argument count do Buffer.BlockCopy powinien określać liczbę bajtów do skopiowania |
W przypadku używania Buffer.BlockCopy argument count określa liczbę bajtów do skopiowania. Należy użyć tylko Array.Length dla argumentu count w tablicach, których elementy są dokładnie jednym bajtem rozmiaru.
byte , sbyte i tablice bool mają elementy o rozmiarze jednego bajtu. |
CA2019: pola ThreadStatic nie powinny używać inicjowania wbudowanego |
Pole z adnotacjami z ThreadStaticAttribute jest inicjowane w tekście lub jawnie w konstruktorze static (Shared w języku Visual Basic). |
CA2020: Zapobieganie zmianom behawioralnym spowodowanym przez wbudowane operatory intPtr/UIntPtr | Niektóre wbudowane operatory dodane na platformie .NET 7 zachowują się inaczej niż operatory zdefiniowane przez użytkownika na platformie .NET 6 i starszych wersjach. Niektóre operatory, które były używane do zgłaszania nieznaczonego kontekstu podczas przepełnienia nie są już zgłaszane, chyba że opakowane w kontekście sprawdzonym. Niektóre operatory, które wcześniej nie zgłaszały zaznaczonego kontekstu, zgłaszają teraz, chyba że są opakowane w nieznakowanym kontekście. |
CA2021: Nie wywoływanie funkcji Enumerable.Cast<T> lub Enumerable.OfType<T> z niezgodnymi typami | Wywołanie Enumerable.Cast<TResult>(IEnumerable) lub Enumerable.OfType<TResult>(IEnumerable) określa parametr typu niezgodny z typem kolekcji wejściowej. |
CA2022: Unikaj nieistniejącego odczytywania przy użyciu Stream.Read | Wywołanie Stream.Read może zwrócić mniej bajtów niż zażądano, co powoduje zawodny kod, jeśli wartość zwracana nie jest sprawdzana. |
CA2024: Nie używaj strumieniaReader.EndOfStream w metodach asynchronicznych | Właściwość StreamReader.EndOfStream może spowodować niezamierzone blokowanie synchroniczne, gdy żadne dane nie są buforowane. Zamiast tego użyj StreamReader.ReadLineAsync() bezpośrednio, co zwraca null po osiągnięciu końca strumienia. |
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.