Использование блоков в выражении переключателя C#?
Мне не удалось найти документацию по этой проблеме. (возможно, я просто плохо использую Google...) Я предполагаю, что ответ отрицательный, однако я не понял, где это рассматривается в документации. Если быть точным, у меня следующий вопрос.
Предположим, я хочу выполнить что-то вроде этого:
DirectoryInfo someDir = new DirectoryInfo(@".\someDir");
Console.WriteLine($"Would you like to delete the directory {someDir.FullName}?");
string response = Console.ReadLine().ToLower();
response switch
{
"yes" => { someDir.Delete(); ... MoreActions},
_ => DoNothing()
};
Я понимаю, что могу добиться желаемого поведения с помощью обычного переключателя или if/else, однако мне было любопытно, можно ли в этом случае использовать выражение переключения.
4 ответа
однако я не понял, где это рассматривается в документации
Об этом говорится довольно ясно здесь:
Здесь есть несколько улучшений синтаксиса:
- Переменная стоит перед ключевым словом switch. Различный порядок позволяет визуально легко отличить выражение switch от оператора switch.
- Элементы case и: заменяются на =>. Это более лаконично и интуитивно понятно.
- Регистр по умолчанию заменяется на _ discard.
- Тела - это выражения, а не утверждения.
{ someDir.Delete(); ... MoreActions}
это не выражение.
Однако, как говорится, можно злоупотреблять любой функцией:)
Вы можете заставить выражение switch оцениватьAction
, и вызвать это действие:
Action a = response switch
{
"yes" => () => { ... },
_ => () => { .... }
};
a();
Вы даже можете сократить это до одного оператора:
(response switch
{
"yes" => (Action)(() => { ... }),
_ => () => { ... }
})();
Но только не делай этого...
Вы также можете ввести локальную функцию (C# 7.0 и выше) и сделать что-то вроде:
response switch
{
"yes" => DoSomething(),
_ => DoNothing()
};
void DoSomething()
{
someDir.Delete();
... MoreActions
}
Согласно документации: тела - это выражения, а не утверждения.
Вы можете сделать что-то вроде этого:
Action fn = response switch
{
"yes" => () => { BlockTest(); },
_ => () => { OldTest(); }
};
Я думаю, что эта функция будет там очень скоро. Предложение для этого