Skip to content

CodeStyle

Smirnov Ivan edited this page Jul 27, 2022 · 1 revision

Общие требования к CodeStyle

Правила наименования

Код

  • Классы, методы, публичные поля, публичные свойства, namespaces: PascalCase;
  • Локальные переменные, параметры, названия protected, internal и protected internal полей и свойств: camelCase;
  • Названия private полей и свойств: _camelCase;
  • Наименования не зависят от модификаторов static, readonly, и т.д.
  • Наименования constзаглавными буквами через нижнее подчеркивание MAXIMUM_LENGHT
  • Названия интерфейсов начинаются с заглавной I, например IInterface;

Файлы

  • Названия папок и файлов в PascalCase, например MyFile.cs;
  • По возможности название файла должно совпадать с именем главного класса в этом файле, e.g. MyClass.cs;
  • В общем, стараться чтобы на один файл был один главный класс;

Порядок элементов

  • Модификаторы в порядке: public protected internal private new abstract virtual override sealed static readonly extern unsafe volatile async; Модификаторы обязательно писать
  • Использование пространств имен (секция using) перед объявлением namespace. using в алфавитном порядке, не считая System, они всегда идут первыми;
  • Порядок членов класса:
    • Члены класса в таком порядке:
      • Вложенные классы, структуры, enums, делегаты и события;
      • Статические, константы и readonly поля;
      • Поля и свойства;
      • Конструкторы и деструкторы;
      • Методы.
    • В каждой группе элементы должны быть в следующем порядке:
      • public
      • internal
      • protected internal
      • protected
      • private
    • По возможности группировать реализации интерфейсов

Правила форматирования кода

  • Отступ - 4 пробела;
  • Символ переноса строки - LF;
  • Фигурные скобки всегда с новой строки;
  • Использовать фигурные скобки, даже когда это опционально;
  • Пробел после if/for/while etc., и после запятых;
  • Нет пробела после открывающей и перед закрывающей круглых скобок;
  • Нет пробела между унарным оператором и его операндом. Один пробел между оператором и каждым операндом всех остальных операторов
  • Длина строки кода ограничена шириной редактора (примерно 2/3 ширины экрана). Если строка не влезает - переносить на следующую с отступом в 4 пробела
  • При объявлении методов (конструкторов), принимающих больше двух параметров, или если такое объявление не помещается в одну строку, второй и последующий аргументы переносить на новую строку
  • По возможности группировать код внутри метода на логические части (слишком малые для вынесения в отдельный метод) с помощью пустых строк, чтобы избежать "длинных простыней кода"
  • По возможности стараться уместить код одного метода в длину одного листинга (высота экрана)
  • Ограничения для обобщённых методов (where T: class) указывать на следующей строке после объявления метода
  • Комментарии оставлять на отдельной строке перед комментируемым кодом (не в конце строки). Отделять слэши от текста комментария пробелом (// comment вместо //comment). В комментариях помнить правила русского языка - начинать с заглавной буквы, ставить в конце точку;
  • При использовании Method Chaining (в т.ч. LINQ) каждый новый метод начинать с новой строки;
  • Атрибуты должны быть над сущностью с которой они связаны, каждый атрибут с новой строки;
  • Для определений и вызовов методов, если не все аргументы помещаются в одну строку, их следует разбить на несколько строк, при этом каждая последующая строка выровнена с первым аргументом. Если для этого недостаточно места, аргументы могут быть размещены в последующих строках с отступом в четыре пробела.

Рекомендации по написанию кода на C#

  • При объявлении переменных использовать ключевое слово var вместо явного указания типа там, где это возможно;
  • При инициализации пустых строк и массивов использовать string.Empty и Array.Empty вместо "" и new[]{};
  • Использовать switch/case вместо множества if;
  • По возможности использовать DI, при написании новых классов выделять интерфейсы.
  • Все члены Enum'ов должны явным образом нумероваться, начиная с 0: public enum Color { Red = 0, Blue = 1, Green = 190 }

Константы

  • Если переменную или поле можно сделать константой - оно должно быть константой;
  • Если не получается с константой, можно попробовать readonly как альтернативу;
  • Лучше именованные константы, чем "магические числа" в коде.

LINQ

  • Предпочитайте методы расширения элементов, ключевым словам LINQ в стиле SQL. Например: используйте myList.Where(x) вместо myList where x;
  • Избегайте использования Container.ForEach (...) для всего, что длиннее одного утверждения.