Рекомендации и методы программирования на C# в 2021¶
Оригинальная статья (англ.), автор Vincent Maverick Durano
Совет № 1¶
✋ Старайтесь избегать традиционных if-else
заявлений, например следующих:
1 2 3 4 5 6 7 8 9 |
|
👍 Вместо этого используйте тернарный условный оператор ( ?:
):
1 |
|
Предыдущий код намного чище, его легче читать и понимать. Вдобавок это более лаконично.
Совет № 2¶
✋ Старайтесь избегать использования if
оператора для null
проверок, как показано ниже:
1 2 3 4 5 6 7 |
|
👍 Вместо этого используйте нулевой условный ?.
оператор ( ):
1 |
|
Предыдущий код также намного чище и лаконичнее.
Совет № 3¶
✋ Старайтесь избегать сложных if-else
операторов для проверки на null, как показано ниже:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
👍 Вместо этого используйте нулевой ??
оператор coalescing ( ):
1 |
|
Совет № 4¶
✋ Старайтесь избегать использования следующего кода при возврате значения по умолчанию, когда объект имеет значение NULL:
1 2 |
|
👍 Также используйте нулевой ??
оператор coalescing ( ):
1 |
|
👍 или, как вариант, вы можете:
1 |
|
Совет № 5¶
✋ Старайтесь избегать использования оператора равенства ( ==
) или HasValue
проверки переменных, допускающих значение NULL, как показано ниже:
1 2 3 4 5 6 7 8 9 10 11 |
|
👍 Хотя предыдущий код в порядке, мы все же можем улучшить его, используя is
ключевое слово, как показано ниже:
1 2 3 4 5 6 |
|
Предыдущий код намного легче читать, так как цель очень ясна.
Совет № 6¶
✋ Избегайте кода без фигурных скобок ( {}
) для одного условного if
оператора for
и foreach
циклов, как показано ниже:
1 |
|
Без фигурных скобок слишком легко случайно добавить вторую строку, думая, что она включена в if, а когда это не так.
👍 Всегда используйте вместо этого скобки:
1 2 3 4 5 6 7 |
|
Совет № 7¶
✋ Старайтесь избегать использования нескольких if-else
утверждений, например следующих:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
👍 Вместо этого используйте операторы switch:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
👍 Но switch expressions
по switch statements
возможности предпочитайте следующее:
1 2 3 4 5 6 7 |
|
Приведенный выше код еще более лаконичен, по-прежнему его легко читать и понимать. (Примечание, доступно только в C # 8 или более поздних версиях) 💡 Исключения. Есть случаи, когда if-else
операторы имеют больше смысла, чем использование switch
операторов. Например, если в условии задействованы разные объекты и сложные условия. Используйте свое суждение в отношении того, что работает лучше. 😉
Совет № 8¶
👍 Используйте using statement
при работе с объектами, которые потребляют ресурсы или реализуют IDisposable
интерфейс:
1 2 3 4 |
|
👍 Или предпочитаете использовать новое, using declaration
представленное в C # 8, как показано ниже:
1 2 |
|
Приведенный выше код уменьшает количество фигурных скобок в вашем методе, но по-прежнему легко увидеть, где расположен ресурс. Для получения дополнительной информации см .: «Использование на основе шаблонов» и «Использование объявлений».
Совет № 9¶
✋ Избегайте объединения строк со +
знаком / символом, как показано ниже:
1 2 |
|
👍 Вместо этого используйте string.Format()
метод:
1 2 |
|
👍 Или предпочтительнее использовать Prefer с использованием строковой интерполяции ( $
), где это возможно:
1 2 |
|
Приведенный выше код намного более краток и удобочитаем по сравнению с другими подходами.
Совет № 10¶
✋ Старайтесь избегать string.Format()
форматирования простых объектов, как показано ниже:
1 2 |
|
👍 Используйте вместо этого строковую интерполяцию:
1 2 |
|
Приведенный выше код намного проще для понимания и краток. Однако есть определенные случаи, когда использование string.Format()
would имеет больше смысла. Например, при работе со сложным форматированием и манипулированием данными. Итак, используйте свое суждение, когда применять их в ситуациях.
Совет № 11¶
✋ Избегайте использования определенного типа для сложных объектов при определении переменных, как показано ниже:
1 |
|
👍 Используйте var
вместо этого ключевое слово:
1 |
|
👍 То же самое и с другими локальными переменными:
1 2 3 |
|
Совет № 12¶
✋ Старайтесь избегать однострочной реализации метода с фигурными скобками, как показано ниже:
1 2 3 4 |
|
👍 Вместо этого используйте реализацию Expression-bodied ( =>
):
1 |
|
Предыдущий код более лаконичен, но сохраняет удобочитаемость.
Совет № 13¶
✋ Избегайте инициализации объекта, как показано ниже:
1 2 3 |
|
👍 Вместо этого используйте инициализаторы объектов и коллекций:
1 2 3 4 |
|
Предыдущий код более естественен для чтения, и его цель ясна, поскольку свойства определены в фигурных скобках.
Совет № 14¶
✋ Избегайте создания класса только для того, чтобы вернуть два простых набора результатов, как показано ниже:
1 2 3 4 5 6 7 8 9 10 |
|
👍 По возможности используйте Tuples
вместо них:
1 2 3 4 |
|
Предыдущий код более удобен для доступа к объектам и управления набором данных. Tuples
заменяет необходимость создания нового класса, единственная цель которого - переносить данные.
Совет № 15¶
✋ Попробуйте создать методы расширения для выполнения общих задач, таких как преобразование, проверка, форматирование, синтаксический анализ, преобразование, вы называете это. Итак, вместо того, чтобы делать следующее:
1 2 |
|
Предыдущий код прекрасен и должен безопасно обрабатывать преобразование. Однако код немного длинен, чтобы выполнить базовое преобразование. Представьте, что в разных областях вашего проекта есть масса одного и того же беспорядка, связанного с преобразованием кода. Ваш код может превратиться в беспорядок или потенциально вызвать у вас много времени на разработку сверхурочно.
👍 Чтобы предотвратить это, вам следует подумать о создании вспомогательных / служебных функций для выполнения общих задач, которые можно повторно использовать в проектах. Например, предыдущий код теперь можно преобразовать в следующее расширение:
1 2 3 4 5 |
|
и вы сможете использовать метод расширения, как показано ниже, в любом месте вашего кода:
1 |
|
Приведенный выше код делает ваш код кратким, простым для понимания и обеспечивает удобство. Я создал пакет NuGet, который выполняет подобные общие задачи. Вы можете найти его по следующей ссылке, если хотите интегрировать его в свои проекты.
https://github.com/proudmonkey/HelpMate.Core
Совет № 16¶
✋ Избегайте использования типов данных , таких как .NET предопределены Int32
, String
, Boolean
и т.д .:
1 2 3 |
|
👍 Вместо этого используйте встроенные примитивные типы данных:
1 2 3 |
|
Приведенный выше код согласуется с Microsoft .NET Framework и делает код более естественным для чтения.
Совет № 17¶
✋ Не используйте инициалы в качестве сокращений идентификаторов, как показано ниже:
1 |
|
Основная причина этого в том, что это может вызвать путаницу и несогласованность, если у вас есть класс, который может представлять то же самое, что и в следующем:
1 |
|
👍 Вместо этого выберите краткость ясности, как показано ниже:
1 2 |
|
Приведенный выше код обеспечивает большую ясность, поскольку ясно указывает, о чем идет речь.
Совет № 18¶
👍 Организуйте пространства имен с четко определенной структурой. Обычно пространства имен должны отражать иерархию папок в проекте. Взгляните на следующий пример:
1 2 3 4 5 |
|
Приведенный выше код предполагает хорошую организацию кода внутри проекта, позволяющую легко перемещаться между слоями.
Совет № 19¶
👍 Используйте формы единственного числа, существительное или существительное, чтобы назвать class
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
Это позволяет легко определить, содержит ли объект одно значение элемента или коллекцию. Представьте себе, если у вас есть List<People>
против List<Person>
. Просто странно помещать имена во множественном числе в Список или Коллекцию.
Совет № 20¶
👍 Используйте существительные или прилагательные в названиях объектов недвижимости. При именовании логических свойств или переменных вы можете добавить префикс «can», «is», «has» и т. Д., Как показано ниже:
1 2 3 4 5 6 |
|
Добавление этих суффиксов принесет больше пользы вызывающему абоненту.
Совет № 21¶
👍 Используйте регистр Pascal для имен переменных классов, методов, свойств и констант:
1 2 3 4 5 6 7 8 9 10 11 |
|
Это сделано для того, чтобы наш код соответствовал Microsoft .NET Framework.
Подсказка № 22¶
👍 Используйте Camel Casing для аргументов метода и локальных переменных:
1 2 3 4 |
|
Это сделано для того, чтобы наш код соответствовал Microsoft .NET Framework.
Совет 23¶
👍 Используйте понятные и понятные имена для классов, методов и свойств:
1 2 3 4 5 6 |
|
Это упрощает чтение и понимание вашего кода без необходимости писать (или, по крайней мере, минимизировать) комментарии о том, что делает код.
Подсказка № 24¶
👍 Используйте суффикс асинхронных методов со Async
словом:
1 2 3 4 |
|
Это позволяет разработчикам легко отличать синхронные от асинхронных методов, просто взглянув на сам метод.
Совет № 25¶
Делайте префикс interfaces
с заглавной буквыI
1 2 3 4 |
|
Это сделано для того, чтобы легко различать интерфейс и классы. Фактически, это хорошо известный стандарт определения интерфейсов.
Подсказка № 26¶
👍 Сделайте префикс глобальных переменных и членов класса символами подчеркивания ( _
):
1 2 3 |
|
Это сделано для того, чтобы легко различать локальные и глобальные идентификаторы / переменные.
Подсказка № 27¶
👍 Объявите все переменные-члены и поля в верхней части класса, со статическими полями в самом верху:
1 2 3 |
|
Это просто общепринятая практика, которая избавляет от необходимости искать объявления переменных.
Подсказка № 28¶
👍 Обязательно подумайте о том, чтобы поместить все свои private
методы в нижнюю часть после public
методов:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
Почему? по той же причине для Совет № 28.
Подсказка № 29¶
✋ Старайтесь не группировать код по регионам, как показано ниже:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Приведенный выше код представляет собой запах кода, который потенциально может вызвать рост вашего кода, даже если вы этого не заметите. Я признаю, что я использовал эту функцию много раз, чтобы свернуть код внутри класса. Однако я понимаю, что скрытие кода в регионах не принесет вам никакой пользы, кроме увеличения вашего визуального представления, когда регион свернут. Если вы работаете с командой разработчиков над проектом, скорее всего, другие разработчики будут добавлять туда свой код до тех пор, пока код со временем не станет все больше и больше. Как хорошая практика, всегда рекомендуется делать классы как можно меньше.
Если у вас есть множество частных методов внутри класса, вы можете вместо этого разделить их на отдельный класс.
Подсказка № 30¶
👍 Старайтесь использовать сокращенные имена только тогда, когда они общеизвестны:
1 |
|
Было бы слишком много называть переменную «createQuestionDefinitionRequestDto», когда вы знаете, что переменная / параметр является объектом запроса. То же самое применимо к FTP, пользовательскому интерфейсу, вводу-выводу и т. Д. Совершенно нормально использовать аббревиатуры до тех пор, пока они общеизвестны, иначе было бы контрпродуктивно не делать этого.
Подсказка № 31¶
✋ Избегайте подчеркивания ( _
) между именами идентификаторов:
1 2 3 |
|
Причина в том, что C # не является postgres. Просто шучу! Серьезно, это должно соответствовать соглашению Microsost .NET Framework и сделать ваш код более естественным для чтения. Это также может помочь избежать «подчеркивания подчеркивания» или неспособности увидеть подчеркивание.
Подсказка № 32¶
✋ Не используйте ЗАПИСЫВАЮЩИЕ заглавные буквы для констант или переменных только для чтения:
1 2 |
|
Они просто привлекают слишком много внимания.
Подсказка № 33¶
✋ Не используйте венгерскую нотацию или любую другую идентификацию типа в идентификаторах (кроме интерфейсов):
1 2 3 4 |
|
Редактор кода Visual Studio уже предоставляет полезные подсказки для определения типов объектов. В общем, вы хотите избежать указателей типа в идентификаторе.
Подсказка № 34¶
✋ Не используйте суффикс «Enum» в enum
именах типов и не используйте имена во множественном числе для enums
.
Ниже приведен пример определения перечисления:
1 2 3 4 5 6 7 8 |
|
Опять же, это должно соответствовать структуре Microsoft .NET и избегать указателей типа в идентификаторе.
Подсказка № 35¶
👍 Попробуйте использовать record
типы для неизменяемых объектов. Типы записей - это новая функция, представленная в C # 9, которая упрощает ваш код. Например, такой код:
1 2 3 4 5 6 7 8 9 10 11 |
|
можно записать следующим образом с помощью записи:
1 |
|
Использование типов записей автоматически генерирует шаблонный код для вас и сохраняет ваш код кратким. Записи будут действительно полезны для определения DTO, команд или любого объекта, который переносит неизменяемые данные. Дополнительные сведения об этой функции см. В разделе Типы записей.