Возможно ли иметь несколько строк в операторе switch языка C# 8?

Вопрос или проблема

В C# 8 у нас есть оператор возврата switch, который выглядит так:

return a switch
{
    1 => "op1",
    2 => "op2",
    3 => "op3",
    _ => "default"
};

Можно ли что-то записать в лог перед возвратом? Например:

return a switch
{
    1 => { Console.WriteLine("op1"); return "op1"; },
    2 => "op2",
    3 => "op3",
    _ => "default"
};

Взяв страницу из javascript:

return a switch
{
    1 => ((Func<string>) (() => { Console.WriteLine("op1"); return "op1";}))(),
    2 => "op2",
    3 => "op3",
    _ => "default"
};

Если мне нужно это рассмотреть, я хочу увидеть действительно вескую причину, почему это не оператор switch.

Мне приходилось делать что-то подобное в фильтре исключений несколько раз, когда нельзя ставить оператор. Это то, что никто не любит, но время от времени это приходится делать.

Ответ или решение

В C# 8 действительно имеется возможность использования выражений switch, что позволяет сокращать код и делать его более лаконичным. Однако важно понимать, что в выражениях switch не поддерживаются множественные инструкции в рамках одного case, так как они ожидают возвращать единственное значение.

Логика работы выражения switch

Как вы упомянули, в C# 8 синтаксис для switch можно представить следующим образом:

return a switch
{
    1 => "op1",
    2 => "op2",
    3 => "op3",
    _ => "default"
};

Здесь выражение switch используется для возвращения строкового значения в зависимости от переменной a. Этот синтаксис делает код более чистым и удобочитаемым, однако он также накладывает определенные ограничения.

Проблема множественных инструкций

При попытке вставить несколько операторов внутри одного case, как в следующем примере:

return a switch
{
    1 => { Console.WriteLine("op1"); return "op1"; },
    2 => "op2",
    3 => "op3",
    _ => "default"
};

Вы получите ошибку компиляции. В выражениях switch поддерживается только одно выражение для каждой ветки. Поэтому необходимо выбирать другие пути для достижения желаемого результата.

Альтернативные подходы

Можно использовать lambda-выражения или делегаты для инкапсуляции логики, однако это значительно усложнит код и может снизить его читаемость:

return a switch
{
    1 => ((Func<string>)(() => { Console.WriteLine("op1"); return "op1"; }))(),
    2 => "op2",
    3 => "op3",
    _ => "default"
};

Хотя данный подход рабочий, он выглядит вероломно и не соответствует принципам чистоты кода, специфичным для C#. Вопрос в том, стоит ли применять такие конструкции, когда могут быть более прямолинейные решения.

Рекомендованные подходы

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

switch (a)
{
    case 1:
        Console.WriteLine("op1");
        return "op1";
    case 2:
        return "op2";
    case 3:
        return "op3";
    default:
        return "default";
}

Такой подход уточняет намерения кода, делает его более понятным и легким для поддержки.

Заключение

В C# 8 решения с использованием выражения switch не предназначены для выполнения нескольких инструкций. Если ваши требования подразумевают выполнение дополнительных логических шагов, лучше использовать классический switch. Это помогает избежать путаницы, сохраняя при этом читаемость и поддерживаемость вашего кода.

Оцените материал
Добавить комментарий

Капча загружается...