Набор правил "Базовые нормы и правила разработки" для управляемого кода
Набор правил "Базовые правила и рекомендации по разработке корпорации Майкрософт" призваны сделать код понятнее и проще в использовании.Данный набор правил следует добавлять, если в проекте содержится код библиотек, или в случае необходимости принудительного применения рекомендаций для простоты обслуживания кода.
В наборе "Базовые правила и рекомендации по разработке" содержатся все правила из набора правил "Минимальные правила и рекомендации корпорации Майкрософт".Список правил в минимальном наборе см. в разделе Набор правил "Рекомендуемые правила для управляемого кода".
В следующей таблице описываются все правила набора правил "Базовые правила и рекомендации по разработке корпорации Майкрософт".
Правило |
Описание |
---|---|
Типы, которым принадлежат освобождаемые поля, должны быть освобождаемыми |
|
Правильно объявите обработчики событий |
|
Пометьте сборки атрибутом AssemblyVersionAttribute |
|
Методы интерфейса должны быть доступны для вызова дочерним типам |
|
Типы, которым принадлежат собственные ресурсы, должны быть освобождаемыми |
|
Переместите P/Invokes в класс NativeMethods |
|
Не скрывайте методы базового класса |
|
Следует правильно реализовывать IDisposable |
|
Не вызывайте исключения в непредвиденных местах |
|
Избегайте повторяющихся сочетаний клавиш быстрого доступа |
|
Необходимо наличие точек входа P/Invoke |
|
Методы P/Invoke не должны быть видимыми |
|
Типы макета Auto не должны быть видимыми для COM |
|
Вызовите GetLastError сразу после P/Invoke |
|
Базовые типы, относящиеся к типу видимых COM-клиенту, должны быть видимыми для COM |
|
Методы регистрации COM должны быть согласованы |
|
Правильно объявите методы P/Invoke |
|
Удалите пустые методы завершения |
|
Поля типа значения должны быть переносимыми |
|
Объявления P/Invoke должны быть переносимыми |
|
Не блокируйте объекты со слабой идентификацией |
|
Проанализируйте SQL-запросы с целью выявления уязвимостей безопасности |
|
Укажите тип маршалинга для строковых аргументов P/Invoke |
|
Проверьте объявляемые параметры безопасности типов значений |
|
Указатели не должны быть видимыми |
|
Защищенные типы не должны предоставлять поля |
|
Безопасность метода должна быть надмножеством типа |
|
APTCA-методы должны вызывать только APTCA-методы |
|
APTCA-типы должны расширять только базовые APTCA-типы |
|
Не используйте косвенное представление методов с требованиями ссылки |
|
Переопределяющие требования ссылки должны быть идентичны базовым |
|
Ограничьте уязвимые предложения finally во внешних блоках try |
|
Для требований ссылок на тип необходимы требования наследования |
|
Критические с точки зрения безопасности типы могут не участвовать в эквивалентности типов |
|
Конструкторы по умолчанию должны быть по меньшей мере такими же критическими, как конструкторы по умолчанию базового типа |
|
Делегаты должны привязываться к методам с соответствующей прозрачностью |
|
Методы должны сохранять согласованную прозрачность при переопределении базовых методов |
|
Прозрачные методы должны содержать только поддающийся проверке IL |
|
Прозрачные методы не должны вызывать методы с атрибутом SuppressUnmanagedCodeSecurity |
|
Прозрачный код не должен ссылаться на элементы, критичные в плане безопасности |
|
Прозрачные методы не должны удовлетворять требования LinkDemand |
|
Типы должны быть настолько же критическими, как их базовые типы и интерфейсы. |
|
Прозрачные методы могут не использовать утверждения безопасности |
|
Прозрачные методы не должны вызывать машинный код |
|
Следует повторно вызывать исключение для сохранения сведений о стеке |
|
Не удаляйте объекты несколько раз |
|
Используйте встроенную инициализацию статических полей типов значений |
|
Не помечайте обслуживаемые компоненты атрибутом WebMethod |
|
Высвободите высвобождаемые поля |
|
Не вызывайте переопределяемые методы в конструкторах |
|
Высвобождаемые типы должны объявлять метод завершения |
|
Методы завершения должны вызывать метод завершения базового класса |
|
Реализуйте конструкторы сериализации |
|
Перегружать равенство операторов следует при перегрузке ValueType.Equals |
|
Отметьте точки входа Windows Forms меткой STAThread |
|
Пометьте все несериализуемые поля |
|
Вызовите методы базового класса для типов ISerializable |
|
Пометьте типы ISerializable атрибутом SerializableAttribute |
|
Правильно реализуйте методы сериализации |
|
Правильно реализуйте ISerializable |
|
Предоставьте правильные аргументы методам форматирования |
|
Правильно выполните проверку NaN |
|
Не объявляйте статические члены в универсальных типах |
|
Не предоставляйте универсальные списки |
|
Используйте экземпляры обработчика универсальных событий |
|
Универсальные методы должны предоставлять параметр типа |
|
Не используйте слишком много параметров в универсальных типах |
|
Не создавайте вложенных универсальных типов в сигнатурах членов |
|
Используйте универсальные объекты, если это уместно |
|
Перечисляемые типы должны иметь нулевое значение |
|
Коллекции должны реализовывать универсальный интерфейс |
|
Попробуйте передать базовые типы в качестве параметров |
|
Абстрактные типы не должны иметь конструкторов |
|
Перегружайте оператор равенства при перегрузке операторов сложения и вычитания |
|
Помечайте сборки атрибутом CLSCompliantAttribute |
|
Помечайте сборки атрибутом ComVisibleAttribute |
|
Помечайте атрибуты с помощью AttributeUsageAttribute |
|
Определите методы доступа для аргументов атрибута |
|
Индексы не должны быть многомерными |
|
Используйте свойства, если это уместно |
|
Замените повторяющиеся аргументы массивом параметров |
|
Не следует использовать параметры по умолчанию |
|
Следует помечать перечисления атрибутом FlagsAttribute |
|
Хранилище перечисляемых типов должно относиться к типу Int32 |
|
Используйте события, если это уместно |
|
Не перехватывайте типы общих исключений |
|
Реализуйте стандартные конструкторы исключения |
|
Вложенные типы не должны быть видимыми |
|
В составе реализаций ICollection есть строго типизированные элементы |
|
Переопределите методы в сопоставимых типах |
|
Перечислители должны быть строго типизированы |
|
Списки обладают строгой типизацией |
|
Укажите сообщение ObsoleteAttribute |
|
Используйте целый или строковый аргумент для индексаторов |
|
Свойства не должны быть доступны только на запись |
|
Не перегружайте оператор равенства для ссылочных типов |
|
Не объявляйте защищенные члены в запечатанных типах |
|
Не объявляйте виртуальные члены в запечатанных типах |
|
Объявляйте типы в пространствах имен |
|
Не объявляйте видимые поля экземпляров |
|
Типы со статическими заполнителями должны быть запечатаны |
|
Типы со статическими заполнителями не должны иметь конструкторов |
|
Параметры URI не должны быть строками |
|
Возвращаемые значения URI не должны быть строками |
|
Свойства URI не должны быть строками |
|
Перегрузки строковых параметров URI вызывают перегрузки System.Uri |
|
Типы не должны расширять определенные базовые типы |
|
Члены не должны предоставлять определенные конкретные типы |
|
Исключения должны быть общими |
|
Имена переменных не должны совпадать с именами полей |
|
Избегайте чрезмерной сложности |
|
Идентификаторы должны отличаться не только регистром |
|
Идентификаторы не должны совпадать с ключевыми словами |
|
Проверьте неиспользуемые параметры |
|
Удалите неиспользуемые локальные переменные |
|
Избегайте чрезмерного использования локальных переменных |
|
Инициализируйте статические поля ссылочного типа встроенными средствами |
|
Избегайте невызываемый закрытый код |
|
Избегайте неиспользуемых внутренних классов |
|
Избегайте распечатанных атрибутов |
|
Используйте ступенчатые массивы вместо многомерных |
|
Следует переопределять равенства и операторы равенства в типах значений |
|
Свойства не должны возвращать массивы |
|
Проверьте наличие пустых строк путем проверки длины строки |
|
Помечайте члены как статические |
|
Избегайте неиспользованных закрытых полей |
|
Не вызывайте зарезервированные типы исключений |
|
Используйте управляемые эквиваленты API Win32 |
|
Правильно создавайте экземпляры исключений аргументов |
|
Поля, не являющиеся константами, не должны быть видимыми |
|
Не помечайте перечисления атрибутом FlagsAttribute |
|
Не создавайте исключения в предложениях исключений |
|
Методы завершения должны быть защищены |
|
Не уменьшайте видимость унаследованных членов |
|
Члены должны различаться не только возвращаемым типом |
|
Переопределите равенство при перегрузке оператора равенства |
|
Для перезагрузок оператора существуют дополнения с именами |
|
Перегрузки операторов должны быть симметричны |
|
Свойства коллекции должны иметь параметр "только для чтения" |
|
Используйте params для переменного количества аргументов |
|
Передавайте объекты System.Uri вместо строк |
|
Предоставьте методы десериализации для необязательных полей |