C# — надежный и проверенный временем язык. Однако даже самые опытные разработчики время от времени допускают ошибки. Чтобы писать код, который легко читать и поддерживать, важно следовать рекомендациям.
В этом сообщении блога будут обсуждаться некоторые из наиболее распространенных передовых практик C# и объясняется, почему они важны. Имейте в виду, что не все эти рекомендации применимы к каждому проекту — руководствуйтесь здравым смыслом, решая, что подходит для вашей кодовой базы.
Перечисления:
- При проверке того, является ли IEnumerable‹T› пустым, всегда используйте enumerable.Any() вместо enumerable.Count() == 0.
- При возврате коллекции всегда возвращайте пустую коллекцию, если в ней нет элементов, но никогда не 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, чтобы переложить ответственность на вызывающую сторону.