Порядок предметов в классах: поля, свойства, конструкторы, методы

391

Существует ли официальное руководство С# для порядка элементов в терминах структуры класса?

Идет ли это:

  • Открытые поля
  • Частные поля
  • Свойства
  • Конструкторы
  • Методы
    ?

Мне любопытно, есть ли жесткое правило о порядке вещей? Я вроде как повсюду. Я хочу придерживаться определенного стандарта, поэтому я могу делать это везде.

Реальная проблема заключается в том, что мои более сложные свойства в конечном итоге очень похожи на методы, и они чувствуют себя неуместными наверху перед конструктором.

Любые советы/предложения?

  • 6
    На самом деле, чтобы ответить на актуальный вопрос, нет, нет официального руководства. StyleCop реализует рекомендации, разработанные для использования в одной определенной группе в Microsoft. Это не официальное руководство, и может даже не быть единообразным среди групп в Microsoft.
  • 0
    Один простой способ - увидеть метаданные какого-то сложного класса в .net (F12 в VS). Вы узнаете, как это заказано хотя бы для public и protected членов.
Показать ещё 1 комментарий
Теги:
coding-style

16 ответов

548
Лучший ответ

В соответствии с Правилами правил StyleCop порядок выглядит следующим образом.

Внутри класса, структуры или интерфейса: (SA1201 и SA1203)

  • Постоянные поля
  • Поля
  • Конструкторы
  • Финализаторы (деструкторы)
  • Делегаты
  • События
  • Перечисления
  • Интерфейсы
  • Свойства
  • Индексаторы
  • Методы
  • Структуры
  • Классы

В каждой из этих групп упорядочивается доступ: (SA1202)

  • общественности
  • внутренний
  • защищенный внутренний
  • защищенный
  • частным

В каждой из групп доступа упорядочивается статический, а затем нестатический: (SA1204)

  • статичным
  • нестатическая

Внутри каждой из статических/нестатических групп полей упорядочивается с помощью readonly, затем не-readonly: (SA1214 и SA1215)

  • только для чтения
  • не только для чтения

Развернутый список длится 130 строк, поэтому я не буду его разворачивать. Развернутая часть методов:

  • общедоступные статические методы
  • общедоступные методы
  • внутренние статические методы
  • внутренние методы
  • защищенные внутренние статические методы
  • защищенные внутренние методы
  • защищенные статические методы
  • защищенные методы
  • частные статические методы
  • частные методы

В документации отмечается, что, если предписанный порядок не подходит, скажем, реализуются несколько интерфейсов, а методы и свойства интерфейса должны быть сгруппированы вместе - затем используйте частичный класс для группировки связанных методов и свойств вместе.

  • 24
    Я хотел бы поблагодарить вас за усилия в этом посте. Я пытаюсь сделать материал StyleCop стандартным (даже если просто быть последовательным и упростить поиск вещей), и это ценно.
  • 40
    Лично меня раздражает порядок статических методов. Сначала я вижу аргумент для статических открытых методов, но обычно я хочу частные статические методы после членов. Они утилиты в конце концов.
Показать ещё 23 комментария
27

Вместо группировки по видимости или по типу элемента (поле, свойство, метод и т.д.), как насчет группировки по функциональности?

  • 2
    Если «сортировка» с использованием рекомендаций StyleCop, это своего рода функциональность. Есть веская причина, почему некоторые методы являются публичными, а другие - частными. Код действительно лучше читается: открывая файл .cs класса, я сразу вижу открытые методы, которые «более важны», чем приватные (для парня, использующего этот класс)
  • 59
    Если в вашем классе так много методов, свойств и т. Д., Что вам нужно сгруппировать их по разделам, возможно, это признак того, что класс делает слишком много?
Показать ещё 7 комментариев
13

Я бы рекомендовал использовать стандарты кодирования IDesign или те, которые перечислены на сайт Brad Abram. Это самые лучшие, которые я нашел.

Брэд сказал бы...

Элементы классов должны быть в алфавитном порядке и сгруппированы в разделы (Поля, Конструкторы, Свойства, События, Методы, Реализации частных интерфейсов, Вложенные типы)

  • 3
    Похоже, что в эти дни эта ссылка ведет на домашнюю страницу IDesign. Похоже, что стандарты кодирования в наши дни скрыты за ссылкой для скачивания по электронной почте #justsaying
  • 0
    Рекомендации должны иметь обоснование. Основанием для этого является: 1. чтобы вы понимали, 2. чтобы вы могли выносить суждения по пограничным, тонким, неоднозначным, непредвиденным или противоречивым делам, 3. чтобы вы могли скорректировать ситуацию, когда условия меняются, а некоторые рекомендации больше не применяются.
9

Это старый, но все же очень актуальный вопрос, поэтому я добавлю следующее: какое первое, что вы ищете, когда открываете файл класса, который вы можете или, возможно, не читали раньше? Поля? Свойства? По опыту я понял, что почти всегда я охочусь за конструкторами, потому что самое основное, что нужно понять, - это как этот объект построен.

Поэтому я начал сначала создавать конструкторы в файлах классов, и результат был психологически очень положительным. Стандартная рекомендация по размещению конструкторов после кучи других вещей кажется диссонирующей.

Предстоящая функция первичного конструктора на С# 6 показывает, что естественное место для конструктора находится в самом верху класса - на самом деле первичные конструкторы задаются еще до открытой скобки.

Забавно, какая разница, как это делает переупорядочение. Это напоминает мне о том, как обычно выполнялись операторы using - сначала с пространством имен System. Команда Visual Studio "Organize Usings" использовала этот порядок. Теперь using упорядочиваются в алфавитном порядке, без специального обращения к пространству имен System. Результат просто проще и чище.

  • 1
    Класс инициализации / построения, на мой взгляд, запутан. Поля инициализируются перед запуском явных конструкторов, поэтому, продолжая свой аргумент, по существу, помещая члены в порядке их использования / создания, инициализированные поля были бы до явно объявленных конструкторов. Инициализированные статические поля и статические конструкторы делают его еще более интересным.
  • 0
    На самом деле, порядок, в котором они обычно ищут люди, понятие литературного программирования, что код должен быть вначале читаемым для людей.
Показать ещё 2 комментария
8

Я не знаю о языковом или отраслевом стандарте, но я, как правило, помещаю вещи в этом порядке с каждым разделом, завернутым в #области:

с помощью выражений

Пространство имен

Класс

Частные члены

Публичные свойства

Конструкторы

Публичные методы

Частные методы

  • 0
    Это именно то, как я это делаю. За исключением между классом и частными членами, у меня есть публичные константы и перечисления и т.д.
  • 0
    Да, я предпочитаю сохранять открытые свойства после частных методов. Другие люди предпочитают помещать конструктор перед открытыми свойствами ... но в моей голове я предпочитаю иметь значения / конструкторы / поведения в этом порядке. Затем «значения» делятся на константы / privateMembers / properties и так. Обычно я не использую регионы, за исключением некоторых больших моделей представления ... ну, модели представления WPF являются чем-то особенным, и, в этом случае, я обычно помещаю вспомогательные закрытые поля непосредственно перед каждым открытым свойством. В этом случае набор частного поля плюс открытый член - это то же самое устройство
4

Как уже упоминалось ранее, на языке С#, который диктует макет, ничего не происходит, я лично использую регионы, и я делаю что-то подобное для среднего класса.

public class myClass
{
#region Private Members

#endregion
#region Public Properties

#endregion

#region Constructors

#endregion
#region Public Methods

#endregion
}

Мне все равно имеет смысл

  • 15
    Здесь нужно сказать (только для информации), что stylecop рекомендует не использовать регионы (SA1124 DoNotUseRegions)
  • 1
    Microsoft сама использует регионы.
Показать ещё 3 комментария
3

От StyleCop

частные поля, общедоступные поля, конструкторы, свойства, общедоступные методы, частные методы

Поскольку StyleCop является частью процесса сборки MS, вы можете увидеть это как стандартный стандарт

  • 0
    Интересно. Вы регулярно используете StyleCop?
  • 0
    Для одного проекта - да, потому что он время от времени привыкает к какой-то работе по контракту с MS. Это очень раздражает улыбка
Показать ещё 3 комментария
3

Обычно я стараюсь следовать следующему шаблону:

  • статические члены (обычно имеют другой контекст, должны быть потокобезопасными и т.д.).
  • члены экземпляра

Каждая часть (статический и экземпляр) состоит из следующих типов элементов:

  • Операторы
  • (всегда статичны)
  • (инициализируется перед конструкторами)
  • Конструкторы
  • деструктор (традиция следовать за конструкторами)
  • Свойства
  • Методы
  • События

Затем члены сортируются по видимости (от менее видимой):

  • частным
  • внутренний
  • внутренняя защита
  • защищенный
  • общественности

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

2

Мое предпочтение - упорядочить по типу, а затем уменьшать видимость следующим образом

public methods
public events
public properties

protected methods
protected events
protected properties

private methods
private events
private properties
private fields

public delegates
public interfaces
public classes
public structs

protected delegates
protected interfaces
protected classes
protected structs

private delegates
private interfaces
private classes
private structs

Я знаю, что это нарушает стиль Cop, и если кто-то может дать мне вескую причину, почему я должен поместить детали реализации типа перед его интерфейсом, я готов изменить. В настоящее время у меня есть сильное предпочтение поместить частных членов.

Примечание. Я не использую общедоступные или защищенные поля.

  • 2
    Согласовано. Я действительно задаюсь вопросом, не является ли идея поставить приватных членов первыми в те дни C, когда переменные должны были быть объявлены первыми. Я почти всегда хочу сначала увидеть общедоступный интерфейс, а не внутренние классы.
  • 0
    Это на самом деле имеет большой смысл. Могу поспорить, это пережиток от C.
Показать ещё 1 комментарий
2

Ближе всего вы можете найти "Руководство по дизайну, управляемый код и .NET Framework" (http://blogs.msdn.com/brada/articles/361363.aspx) Брэд Абрамс

Здесь указаны многие стандарты. Соответствующий раздел - 2.8. Думаю.

1

Я предпочитаю поместить частные поля вверху вместе с конструктором, затем поместить биты публичного интерфейса после этого, а затем биты частного интерфейса.

Кроме того, если определение вашего класса достаточно долго для упорядочивания элементов, это вероятно запах кода указывающий, что ваш класс слишком громоздкий и сложный, и вы должен рефакторинг.

1

единственные рекомендации по кодированию, которые я видел для этого, это указать поля в верхней части определения класса.

Я склонен добавлять конструкторы далее.

Мое общее замечание состояло бы в том, что вы должны придерживаться одного класса для каждого файла и если класс достаточно велик, что организация свойств по сравнению с методами вызывает большую озабоченность, насколько велик класс и нужно ли его рефакторинг? это представляет собой множество проблем?

  • 3
    и когда тебе нужны регионы ... ты проиграл.
0

Это полностью зависит от вас. Вы должны согласиться с некоторыми стандартами. даже плохой стандарт. Но лучше следовать хорошему стандарту:)

0

Я стараюсь как можно проще (по крайней мере для меня)

Перечисление
Объявления
Конструкторы
Заменяет
Методы изображения Свойства
Обработчик событий

0

Закажите вещи, где они чувствуют себя чистыми для вас и тех, кто поддерживает код. У каждого обычно есть определенные предпочтения.

Я не считаю необходимым навязывать определенный стиль или порядок в классе.

0

На языке, который его каким-либо образом принуждает, нет ничего. Я склонен группировать вещи по видимости (public, затем protected, затем private) и использовать #regions для группировки связанных функций функционально, независимо от того, является ли это свойством, методом или чем-то другим. Методы построения (как фактические, так и статические функции factory) обычно находятся на самом верху, так как они - первое, о чем клиенты должны знать.

  • 0
    Я также использую регионы для разделения по видимости, а наличие кода Regionerate делает меня честным. rauchy.net/regionerate
  • 0
    Я не вижу проблем с использованием #regions, однако часто обнаруживаю, что, как только у меня возникает желание добавить регион, это заставляет меня задуматься о разделении моих классов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню