TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.75K subscribers
Post #2557 2.5K
День 2114. #ЗаметкиНаПолях
Функциональное Программирование в C#. Продолжение

Начало

2. Ошибки как значения
Обработка ошибок в C# часто выглядит так:
public class UserService
{
public User CreateUser(string email, string password)
{
if (string.IsNullOrEmpty(email))
throw new ArgumentException("Email is required")
if (password.Length < 8)
throw new ArgumentException("Password too short");
if (_userRepo.EmailExists(email))
throw new DuplicateEmailException(email);

// Create user...
}
}

Проблема в том, что:
- исключения дорогие,
- вызывающий код часто забывает обрабатывать исключения,
- сигнатура метода лжёт — она утверждает, что возвращает User, но может выдать исключение.

Мы можем сделать ошибки явными, используя библиотеку OneOf. Она предоставляет дискриминируемые объединения для C#, используя пользовательский тип OneOf<T0, ... Tn>.
public class UserService
{
public OneOf<
User,
ValidationError,
DuplicateEmailError>
CreateUser(string email, string password)
{
if (string.IsNullOrEmpty(email))
return new ValidationError("Email обязателен");
if (password.Length < 8)
return new ValidationError("Пароль короткий");
if (_userRepo.EmailExists(email))
return new DuplicateEmailError(email);

return new User(email, password);
}
}

Сделав ошибки явными, мы добились, что:
- сигнатура метода говорит всю правду,
- вызывающий код должен обработать все возможные результаты,
- не возникает накладных расходов из-за исключений,
- проще отслеживать поток исполнения.

Вот как это использовать:
var result = userService.CreateUser(email, password);
result.Switch(
user => SendWelcomeEmail(user),
valError => HandleError(valError),
dupError => HandleError(dupError)
);


Продолжение следует…

Источник:
https://www.milanjovanovic.tech/blog/functional-programming-in-csharp-the-practical-parts
  • 👍 21
  • 👎 8
More from @netdeveloperdiary
  1. Oct 6, 2026🦈 Открытое собеседование на Middle C# | 6 октября, 19:00 МСК Приглашаем на открытое собес…
  2. Oct 6, 2026День 2806. #ЗаметкиНаПолях Типы Коллекций в .NET, Которые Стоит Попробовать. Начало Больши…
  3. Oct 5, 2026День 2805. #ЧтоНовенького #NET11 Аргументы в Выражениях Коллекций в C#15 В C#15 реализован…
  4. Oct 4, 2026День 2804. #ВопросыНаСобеседовании Марк Прайс предложил свой набор из 60 вопросов (как тех…
  5. Oct 3, 2026Post #3360
  6. Oct 3, 2026День 2803. #Оффтоп Чем Заняться, Пока Работают Агенты? У VS Code Есть Ответ Сейчас большую…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →