Правила разработки

Правила разработки поддерживают соблюдение рекомендаций по разработке для .NET Framework.

В этом разделе

Правило Description
CA1000: не объявляйте статические элементы в универсальных типах При вызове статического элемента универсального типа нужно указать аргумент этого типа. При вызове универсального экземпляра элемента, не поддерживающего вывод типа, для элемента нужно указать аргумент типа. В этих двух случаях синтаксис для определения аргумента типа различен, и его можно легко спутать.
CA1001: типы, которым принадлежат освобождаемые поля, должны быть освобождаемыми В классе объявляется и реализуется поле экземпляра, которое принадлежит типу System.IDisposable, однако класс не реализует интерфейс IDisposable. Класс, в котором объявляется поле IDisposable, неявно владеет неуправляемым ресурсом и должен реализовывать интерфейс IDisposable.
CA1002: не следует раскрывать универсальные списки System.Collections.Generic.List<(Of <(T>)>) — это универсальная коллекция, предназначенная для производительности, а не наследования. Поэтому виртуальные элементы в списке отсутствуют. Вместо этого для наследования следует предоставить универсальную коллекцию.
CA1003: используйте экземпляры обработчика универсальных событий Тип содержит делегат, возвращающий значение void, сигнатура которого содержит два параметра (первый — объект, а второй — тип, который может быть назначен EventArgs), а включающая сборка предназначена для платформы .NET Framework 2.0.
CA1005: не используйте слишком много параметров в универсальных типах Чем больше параметров типов содержит универсальный тип, тем сложнее знать и запоминать, что представляет каждый параметр типа. Обычно это очевидно с одним параметром типа, как в List<T>, и в некоторых случаях с двумя параметрами типа, как в словаре<TKey, TValue>. Если же используется более двух параметров типов, многие пользователи начинают испытывать большие трудности.
CA1008: перечисляемые типы должны иметь нулевое значение Значение по умолчанию неинициализированного перечисления, как и других типов значений, равно нулю. Перечисление без флагов в качестве атрибутов должно определять член с использованием нулевого значения так, чтобы значение по умолчанию было допустимым значением перечисления. Если перечисление с примененным атрибутом FlagsAttribute определяет член с нулевым значением, для него должно быть задано имя None, свидетельствующее о том, что в перечислении не были заданы значения.
CA1010: коллекции должны реализовывать универсальный интерфейс Чтобы расширить возможности использования коллекции, реализуйте один из универсальных интерфейсов коллекции. Затем данную коллекцию можно использовать для заполнения универсальных типов коллекции.
CA1012: у абстрактных типов не должно быть открытых конструкторов Конструкторы абстрактных типов могут быть вызваны только производными типами. Открытые конструкторы создают экземпляры типа. Невозможно создавать экземпляры абстрактного типа; абстрактный тип с открытым конструктором является недопустимым.
CA1014: помечайте сборки атрибутом CLSCompliantAttribute Спецификация среды CLS определяет ограничения по именованию, типам данных и правилам, которым должны соответствовать сборки, предназначенные для использования в нескольких языках программирования. Для всех сборок рекомендуется явным образом указывать совместимость с CLS с помощью атрибута CLSCompliantAttribute. Если этот атрибут у сборки отсутствует, сборка несовместима.
CA1016: помечать сборки атрибутом AssemblyVersionAttribute .NET использует номер версии для уникального обозначения сборки и для привязки к типам в сборках со строгими именами. Номер версии используется наряду с политикой версий и издателя. По умолчанию приложения выполняются только с версией сборки, которая использовалась для их построения.
CA1017: помечайте сборки атрибутом ComVisibleAttribute Атрибут ComVisibleAttribute определяет порядок обращения клиентов COM к управляемому коду. Для правильной разработки сборки должны явным образом указывать видимость COM. Можно задать видимость COM для всей сборки, а затем переопределить ее для отдельных типов и элементов типов. Если атрибут отсутствует, содержимое сборки будет видимым клиентам COM.
CA1018: помечайте атрибуты как AttributeUsageAttribute При определении настраиваемого атрибута его нужно пометить атрибутом AttributeUsageAttribute, чтобы указать, где можно применять этот настраиваемый атрибут в исходном коде. Допустимое положение атрибута в коде зависит от значения атрибута и его применения.
CA1019: необходимо определять методы доступа для аргументов атрибутов Атрибуты могут определять обязательные аргументы, которые должны быть указаны при применении атрибута к целевому объекту. Они также известны как позиционные аргументы, поскольку предоставляются для конструкторов атрибутов в качестве позиционных параметров. Для каждого обязательного аргумента атрибут должен предоставлять соответствующее свойство, доступное только для чтения, чтобы извлечь значение аргумента во время выполнения. Кроме того, атрибуты могут определять дополнительные параметры, известные как именованные аргументы. Эти аргументы предоставляются для конструкторов атрибутов по имени и должны иметь соответствующее свойство чтения/записи.
CA1021: не используйте параметры out Для реализации передачи типов по ссылке (с помощью ключевого слова out или ref) от разработчика требуется опыт работы с указателями, понимание отличия между типами значения и ссылочными типами и умение работать с методами с несколькими возвращаемыми значениями. Кроме того, далеко не все понимают разницу между параметрами out и ref.
CA1024: используйте свойства, если это уместно Имя открытого или защищенного метода начинается с Get, он не принимает параметры и возвращает значение, не являющееся массивом. Возможно, этот метод лучше преобразовать в свойство.
CA1027: следует помечать перечисления атрибутом FlagsAttribute Перечисление является типом значения, которое определяет набор связанных именованных констант. Атрибут FlagsAttribute применяется к перечислению, когда его именованные константы могут быть объединены осмысленным образом.
CA1028: хранилище перечислений должно иметь тип Int32 Перечисление является типом значения, которое определяет набор связанных именованных констант. По умолчанию для хранения значения константы используется тип данных System.Int32. Этот базовый тип можно изменить, но это не требуется и в большинстве случаев не рекомендуется.
CA1030: используйте события, если это уместно Данное правило отслеживает методы с именами, которые, как правило, используются для событий. Если метод вызывается в ответ на четко определенное изменение состояния, то этот вызов должен осуществляться с помощью обработчика событий. Объекты, вызывающие методы, должны создавать события, а не вызывать методы напрямую.
CA1031: не перехватывайте типы общих исключений Общие исключения не должны перехватываться. Нужно перехватить исключение более конкретного характера или повторно выдать общее исключение в последнем операторе блока catch.
CA1032: реализуйте стандартные конструкторы исключения Для правильной обработки исключений необходимо предоставить полный набор конструкторов.
CA1033: методы интерфейса должны быть доступны для вызова дочерним типам Незапечатанный тип, доступный для внешнего кода, предоставляет явную реализацию метода открытого интерфейса и не предоставляет доступный для внешнего кода альтернативный метод с тем же именем.
CA1034: вложенные типы не должны быть видимыми Вложенный тип — это тип, объявленный внутри области другого типа. Вложенные типы удобно использовать для инкапсуляции закрытых сведений о реализациях содержащего их типа. В силу этого вложенные типы не должны быть видимыми для внешнего кода.
CA1036: переопределяйте методы в сравнимых типах Открытый или защищенный тип реализует интерфейс System.IComparable. Он не переопределяет метод Object.Equals и не перегружает языковой оператор равенства, неравенства, "больше" или "меньше".
CA1040: избегайте пустых интерфейсов Интерфейсы определяют члены, предоставляющие поведение или соглашение об использовании. Функциональность, описанная интерфейсом, может быть использована любым типом вне зависимости от расположения типа в иерархии интерфейса. Тип реализует интерфейс путем предоставления реализаций для членов интерфейса. Пустой интерфейс не определяет никаких элементов, поэтому он не определяет контракт, который можно реализовать.
CA1041: укажите сообщение ObsoleteAttribute Тип или элемент помечен атрибутом System.ObsoleteAttribute, для которого не указано свойство ObsoleteAttribute.Message. При компиляции типа или члена, помеченного с помощью атрибута ObsoleteAttribute, отображается свойство Message атрибута, которое предоставляет пользователю сведения об устаревшем типе или члене.
CA1043: используйте целый или строковый аргумент для индексаторов Индексаторы (индексированные свойства) должны использовать для индекса целочисленные или строковые типы. Эти типы обычно используются для индексации структур данных и повышения удобства использования библиотеки. Тип Object следует использовать только в том случае, если во время разработки невозможно указать определенный целочисленный или строковый тип.
CA1044: свойства не должны быть доступны только на запись Несмотря на то, что допустимо, а часто и необходимо иметь свойство, доступное только на чтение, рекомендации по разработке запрещают использование свойств, доступных только на запись. Это связано с тем, что если позволить пользователю задать значение, а затем запретить ему просматривать это значение, то таким образом не будет обеспечиваться какая-либо безопасность. Кроме того, при отсутствии доступа на чтение нельзя просмотреть состояние общих объектов, что снижает их полезность.
CA1045: не передавайте типы по ссылке Для реализации передачи типов по ссылке (с помощью ключевого слова out или ref) от разработчика требуется опыт работы с указателями, понимание отличия между типами значения и ссылочными типами и умение работать с методами с несколькими возвращаемыми значениями. Архитекторам, разрабатывающим библиотеки для широкого использования, не следует рассчитывать, что пользователи отлично разбираются в использовании параметров out и ref.
CA1046: не перегружайте оператор равенства для ссылочных типов Реализация оператора равенства по умолчанию почти всегда правильно работает для ссылочных типов. По умолчанию две ссылки равны, если они указывают на один объект.
CA1047: не объявляйте защищенные элементы в запечатанных типах Типы объявляют защищенный члены таким образом, чтобы наследующие типы могли получить доступ к члену или переопределить его. По определению наследовать запечатанные типы нельзя; это означает, что вызов защищенных методов для запечатанных типов невозможен.
CA1050: объявляйте типы в пространствах имен Типы объявляются в пространствах имен во избежание конфликтов имен и с целью упорядочения связанных типов в иерархии объектов.
CA1051: не объявляйте видимые поля экземпляров Поля главным образом следует использовать для данных реализации. Поля должны быть помечены как private или internal и должны быть представлены с помощью свойств.
CA1052: типы со статическими заполнителями должны быть запечатаны Открытый или защищенный тип содержит только статические элементы и не объявлен с модификатором sealed (C#) или NotInheritable (Visual Basic). Тип, для которого нельзя создавать унаследованные типы, должен быть помечен модификатором sealed, чтобы его нельзя было использовать как базовый тип.
CA1053: типы статических владельцев не должны иметь конструкторы В открытом или вложенном открытом типе объявляются только статические элементы и имеется открытый или защищенный конструктор по умолчанию. Конструктор не нужен, поскольку при вызове статических членов не требуется экземпляр типа. Для обеспечения безопасности перегруженная строка должна вызывать перегрузку универсального кода ресурса (URI), используя строковый аргумент.
CA1054: параметры URI не должны быть строками Если метод принимает строковое представление универсального кода ресурса (URI), необходимо предоставить соответствующую перегрузку, принимающую экземпляр класса URI, который предоставляет эти услуги безопасным образом.
CA1055: возвращаемые значения URI не должны быть строками В этом правиле предполагается, что метод возвращает универсальный код ресурса (URI). В строковых представлениях кода URI часто встречаются ошибки синтаксического анализа и кодирования, которые могут привести к уязвимостям системы безопасности. Класс System.Uri предоставляет аналогичные услуги более надежным и безопасным способом.
CA1056: свойства URI не должны быть строками В этом правиле предполагается, что свойство представляет URI. В строковых представлениях кода URI часто встречаются ошибки синтаксического анализа и кодирования, которые могут привести к уязвимостям системы безопасности. Класс System.Uri предоставляет аналогичные услуги более надежным и безопасным способом.
CA1058: типы не должны расширять определенные базовые типы Видимый извне тип расширяет некоторые базовые типы. Используйте только один вариант.
CA1060: переместите P/Invokes в класс NativeMethods Методы вызова платформы, например помеченные System.Runtime.InteropServices.DllImportAttribute, или методы, определенные с помощью ключевого слова Declare в Visual Basic, обращаются к неуправляемому коду. Эти методы должны относиться к классу NativeMethods, SafeNativeMethods или UnsafeNativeMethods.
CA1061: не следует скрывать методы базового класса Метод в базовом типе скрыт методом с таким же именем в производном типе. Сигнатура параметра производного метода отличается только типами, которые являются более слабыми, чем соответствующие типы в сигнатуре параметра базового метода.
CA1062: проверьте аргументы открытых методов Все ссылочные аргументы, передаваемые в видимые для внешнего кода методы, должны проверяться на равенство значению NULL.
CA1063: следует правильно реализовывать IDisposable Все типы IDisposable должны правильно реализовывать шаблон "Dispose".
CA1064: исключения должны быть открытыми Внутреннее исключение видно только внутри своей внутренней области. После выхода исключения за пределы внутренней области для перехвата исключения можно использовать только базовое исключение. Если внутреннее исключение унаследовано от System.Exception, System.SystemException или System.ApplicationException, внешний код не имеет достаточных данных для обработки этого исключения.
CA1065: не вызывайте исключения в непредвиденных местах Метод вызывает исключение, хотя не должен этого делать.
CA1066: реализуйте IEquatable при переопределении "Равно" Тип значения переопределяет метод Equals, но не реализует IEquatable<T>.
CA1067: переопределение равно при реализации IEquatable Тип реализует IEquatable<T>, но не переопределяет метод Equals.
CA1068: параметры CancellationToken должны быть последними Метод имеет параметр CancellationToken, который не является последним параметром.
CA1069: перечисления не должны иметь повторяющиеся значения Перечисление содержит несколько элементов, которым явным образом присвоено одно и то же значение константы.
CA1070: не объявляйте поля событий как виртуальные Событие, похожее на поле, было объявлено как виртуальное.