Улучшите свое свободное кодирование с помощью этих основных методов расширения!
Введение
С тех пор, как я узнал о методах расширения, я постоянно находил новые возможности, облегчающие мою жизнь программиста. Методы расширения — идеальное применение O в SOLID — Принцип Открытого Закрытого. Класс должен быть как можно более простым и раскрывать свойства и методы снаружи только тогда, когда они действительно нужны другим компонентам.
С помощью методов расширения вы можете реализовать дополнительные методы для своего класса без необходимости изменения самого класса! Это идеально подходит для повторяющихся методов, которые принимают класс в качестве аргумента.
Реализовать метод расширения довольно просто. Взгляните на следующий пример:
Это реализует метод ForEach()
для каждого IEnumerable<T>
(представленного ключевым словом this
), точно так же, как вы знаете из типа List<T>
. Единственное, что вам нужно сделать, чтобы получить доступ к этому методу, это добавить ссылку на соответствующее пространство имен, в данном случае это System
.
Мои 7 наиболее часто используемых методов расширения
Начиная с .NET 6, Microsoft реализовала несколько методов расширения для IEnumerable<T>
, которые раньше были в моем списке лучших, включая DistinctBy()
и Chunk()
. Однако, начиная с .NET 7, мне все еще не хватает некоторых очень важных методов, особенно для обработки коллекций задач.
Без лишних слов, вот мои наиболее часто используемые методы расширения, которые я использую в .NET 7:
1. Попробуйте асинхронный
Первый метод расширения — мой любимый. Сколько раз вы добавляли новый блок try-catch
вокруг только что созданного метода и немного раздражались из-за того, что он портил внешний вид? Вот очень изящное решение, когда ваш метод возвращает Task
или Task<T>
:
Теперь вы можете просто написать:
var result = await GetSomethingAsync().TryAsync();
И ваш метод будет автоматически заключен в блок try-catch
. Кроме того, вы можете указать errorHandler
для дополнительной логики, такой как ведение журнала. Result
, которые возвращают эти методы, затем можно проверить на успешность, и вы можете продолжить свою логику.
Кстати, Result
или Result<T>
, которые вы можете заметить в этих методах, взяты из моей предыдущей статьи:
2. Когда все асинхронно
Наличие более одного Task
или Task<T>
в коллекции немного неудобно для обработки обычным способом. Вам нужно позвонить Task.WhenAll(tasks)
, что немного выбивает меня из колеи, так как это не беглый стиль. Вот как это выглядит:
Теперь я могу просто иметь любую коллекцию задач и просто написать:
var results = await tasks.WhenAllAsync();
3. Когда все последовательные асинхронные
Следующий метод расширения даже экономит вам еще несколько строк кода и дает вам возможность выполнять каждую задачу одну за другой. Это может быть полезно в сценариях, когда вы не можете выполнять много задач параллельно.
4. Когда все параллельные асинхронные
И последнее, но не менее важное: может быть вариант использования, когда вы можете выполнять задачи параллельно, но может быть ограничение макс. параллельные рабочие. Для этого случая у меня есть следующий метод расширения:
С помощью параметра degree
вы можете указать, сколько задач должно выполняться параллельно.
5. Мапасинк
Это тоже свободное расширение, но на этот раз для одного Task
или Task<T>
.
С помощью этого метода расширения вы можете плавно сопоставить Task<T1>
с Task<T2>
аналогично методу Enumerable.Select()
.
6. DoAsync
Похожим методом является DoAsync()
, но вместо преобразования задачи вы можете выполнить побочную логику с результатом tasks
без изменения возвращаемого значения.
7. Строка. Присоединиться
Самый последний метод расширения, который я иногда использую для объединения строк для ведения журнала. Обычно для этого можно использовать string.Join()
, но опять же, это не бегло и выбивает меня из потока.
Сокращения
Методы сокращения технически не являются методами расширения, но также очень полезны для сохранения некоторого кода:
Чтобы их было легко использовать, вам нужно создать специальный файл (обычно я называю его GlobalUsings.cs
) на корневом уровне и поместить в него следующую строку:
global using static System.Abbreviations;
1. Обр.
Метод Arr
является аббревиатурой для создания нового IEnumerable<T>
из уже существующих значений. Обычно для этого требуется очень уродливый код, как показано ниже:
var arr = new [] { param1, param2,... };
Теперь вы можете просто написать это так:
var arr = Arr(param1, param2,... );
Что выглядит красивее и вам не придется выделывать акробатические трюки с пальцами на клавиатуре.
2. Попробуйте
Как часто вы просто хотели добавить простой блок try-catch
вокруг нового метода, и он казался вам уродливым из-за того, что он занимал так много места в вашем коде? Вот решение с методом аббревиатуры Try()
.
В самой сокращенной форме вы можете написать:
Try(TestMethod);
где TestMethod
— метод, не принимающий никаких параметров. Это позволяет вам писать чрезвычайно короткий код и устранять эти неприятные блоки try-catch
.
Для асинхронных методов я бы порекомендовал вам использовать метод расширения TryAsync
из приведенного выше, так как он находится в свободном стиле.
Конечно, есть больше возможностей, где вы можете использовать эту схему и делать свои собственные сокращения, а также методы расширения. Дайте мне знать, что вы думаете о в комментариях.
Спасибо, что нашли время прочитать эту статью. Надеюсь, вы нашли его информативным, познавательным и интересным.
Мы очень ценим вашу поддержку и участие.
Если вы заинтересованы в том, чтобы быть в курсе последних тенденций, советов и приемов для чистой архитектуры, чистого кодирования и новейших технологических стеков, особенно в контексте C #, .NET и Angular, я был бы признателен. если вы решили следовать за мной.
Удачного дня!
Если вы еще не используете Medium для ежедневного расширения своих знаний, сейчас самое время начать! С Medium вы можете легко получить больше знаний по высокопрофессиональным темам, публиковать качественный контент и охватить более широкую аудиторию. Чтобы начать, просто создайте учетную запись Medium, используя эту ссылку:
Присоединиться к Medium сейчас
Таким образом, вы получите доступ к мощной платформе, которая поможет вам общаться с новыми писателями и читателями и каждый день узнавать что-то новое.