Правила надежности
Правила надежности поддерживают надежность библиотеки и приложений, например правильное использование памяти и потоков. К правилам надежности относятся:
Правило | Описание |
---|---|
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 при достижении конца потока. |
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.