C# — надежный и проверенный временем язык. Однако даже самые опытные разработчики время от времени допускают ошибки. Чтобы писать код, который легко читать и поддерживать, важно следовать рекомендациям.

В этом сообщении блога будут обсуждаться некоторые из наиболее распространенных передовых практик C# и объясняется, почему они важны. Имейте в виду, что не все эти рекомендации применимы к каждому проекту — руководствуйтесь здравым смыслом, решая, что подходит для вашей кодовой базы.

Перечисления:

  1. При проверке того, является ли IEnumerable‹T› пустым, всегда используйте enumerable.Any() вместо enumerable.Count() == 0.
  2. При возврате коллекции всегда возвращайте пустую коллекцию, если в ней нет элементов, но никогда не null.

3. Однако, принимая коллекцию в качестве аргумента метода, всегда проверяйте значение null.

4. Вы можете инициализировать коллекцию с помощью метода расширения:

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

После C# 6 метод Add(), используемый инициализатором коллекции, также может быть методом расширения:

Методы:

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

6. Старайтесь, чтобы максимальное количество аргументов в методе составляло 3.

7. Создайте больше и лучше определенные функции. Собирайте связанные концепции в группы/пакеты, чтобы избежать когнитивной сложности. Подробнее о когнитивной сложности читайте здесь.

Интерфейсы:

8. Сделайте интерфейсы как можно короче, чтобы было относительно просто предоставить им альтернативную реализацию (даже при модульном тестировании).

9. ИЗБЕГАЙТЕ использования маркерных интерфейсов (интерфейсов без элементов).

Заявления:

10. Не используйте var, если тип не виден с правой стороны присваивания. Не думайте, что тип ясен из имени метода. Тип переменной считается чистым, если это новый оператор или явное приведение.

int age = Convert.ToInt32(Console.ReadLine());

Строки:

11. Вместо использования оператора == для сравнения строк используйте метод Equals со StringComparison:

public bool Equals(string value, StringComparison comparisonType);

Остерегайтесь объединения большого количества строк, особенно внутри цикла. Вместо этого используйте класс System.Text.StringBuilder.

Обработка исключений:

12. В целом хорошей практикой программирования является перехват определенного типа исключения, а не использование простого оператора перехвата. Подробнее об этом здесь.

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

14. Всегда отслеживайте стек исключений
Использование throw e; не лучший способ генерировать перехваченное исключение, поскольку C# позволяет нам, просто с помощью throw;, чтобы вызвать исключение в блоке catch.

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

Плохой пример:

Хороший пример:

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