Поделиться через


Правила надежности

Правила надежности поддерживают надежность библиотеки и приложений, например правильное использование памяти и потоков. К правилам надежности относятся:

Правило Описание
CA2000: удаление объектов перед потерей области Так как может произойти исключительное событие, которое не позволит завершить выполнение объекта, объект должен быть явно удален до того, как все ссылки на него не находятся в области.
CA2002: не блокируйте объекты с слабым удостоверением Как сообщается, объект имеет слабое удостоверение, когда он может быть напрямую доступен через границы домена приложения. Поток, который пытается получить блокировку объекта с слабым удостоверением, может быть заблокирован вторым потоком в другом домене приложения с блокировкой одного объекта.
CA2007: не ожидайте непосредственного задачи Асинхронный метод ожидает непосредственно Task.
CA2008: не создавайте задачи без передачи TaskScheduler Операция создания или продолжения задачи использует перегрузку метода, которая не указывает параметр TaskScheduler.
CA2009: не вызывайте ToImmutableCollection для неизменяемого значенияCollection метод ToImmutable был ненужно вызван в неизменяемую коллекцию из пространства имен System.Collections.Immutable.
CA2011: не присваивайте свойство в набора Свойство было случайно назначено значение в пределах собственного задать метод доступа.
CA2012: правильное использование valueTasks ЗначенияTasks, возвращаемые из вызовов элементов, предназначены для непосредственного ожидания. Пытается использовать ValueTask несколько раз или напрямую получить доступ к результату, прежде чем известно, что он будет завершен, может привести к исключению или повреждению. Игнорируя такой параметр ValueTask, скорее всего, указывает на функциональную ошибку и может снизить производительность.
CA2013: не используйте ReferenceEquals с типами значений При сравнении значений с помощью System.Object.ReferenceEquals, если objA и objB являются типами значений, они будут упакована перед передачей в метод ReferenceEquals. Это означает, что даже если objA и objB представляют один и тот же экземпляр типа значения, метод ReferenceEquals, тем не менее, возвращает значение false.
CA2014: не используйте stackalloc в циклах. Пространство стека, выделенное стеком, освобождается только в конце вызова текущего метода. Использование в цикле может привести к росту несвязанного стека и условий переполнения стека.
CA2015: не определяйте методы завершения для типов, производных от MemoryManager<T> Добавление метода завершения в тип, производный от MemoryManager<T>, может позволить освободить память, пока она все еще используется Span<T>.
CA2016: перенаправите параметр CancellationToken в методы, которые принимают один Переадресуйте параметр CancellationToken методам, которые принимают один, чтобы убедиться, что уведомления об отмене операции распространяются должным образом или передаются в CancellationToken.None явным образом, чтобы указать, намеренно не распространяя маркер.
CA2017: несоответствие счетчика параметров Количество параметров, предоставленных в шаблоне сообщения ведения журнала, не соответствует числу именованных заполнителей.
CA2018: аргумент count для Buffer.BlockCopy должен указать количество байтов для копирования При использовании Buffer.BlockCopyаргумент count указывает количество байтов для копирования. Вы должны использовать только Array.Length для аргумента count массивов, элементы которых имеют ровно один размер байта. byte, sbyteи массивы bool имеют элементы размером одного байта.
CA2019: поля ThreadStatic не должны использовать встроенные инициализации Поле, помеченное ThreadStaticAttribute, инициализируется встроенным или явным образом в конструкторе static (Shared в Visual Basic).
CA2020: предотвращение изменения поведения, вызванного встроенными операторами IntPtr/UIntPtr Некоторые встроенные операторы, добавленные в .NET 7, ведут себя не так, как определяемые пользователем операторы в .NET 6 и более ранних версиях. Некоторые операторы, которые использовались для вызова без флажка контекста во время переполнения, больше не вызываются, если не упакованы в проверенный контекст. Некоторые операторы, которые ранее не вызвали флажок в проверяемом контексте, теперь вызываются, если только не упакованы в неконтролируемый контекст.
CA2021: не вызывайте enumerable.Cast<T> или Enumerable.OfType<T> с несовместимыми типами Вызов Enumerable.Cast<TResult>(IEnumerable) или Enumerable.OfType<TResult>(IEnumerable) указывает параметр типа, несовместимый с типом входной коллекции.
CA2022: избегайте неисключаемого чтения с помощью Stream.Read Вызов Stream.Read может возвращать меньше байтов, чем запрошено, в результате чего ненадежный код, если возвращаемое значение не проверяется.
CA2024: не используйте StreamReader.EndOfStream в асинхронных методах Свойство StreamReader.EndOfStream может вызвать непреднамеренные синхронные блокировки, если данные не буферизованы. Вместо этого используйте StreamReader.ReadLineAsync() напрямую, который возвращает null при достижении конца потока.