Search code examples
c#switch-statementswitch-expression

Why does Visual Studio 2019 recommend a switch expression instead of a switch statement?


Visual Studio 2019 recommended converting a switch statement I had written to a switch expression (both included below for context).

For a simple example such as this, is there any technical or performance advantage to writing it as an expression? Do the two versions compile differently for example?

Statement

switch(reason)
{
    case Reasons.Case1: return "string1";
    case Reasons.Case2: return "string2";
    default: throw new ArgumentException("Invalid argument");
}

Expression

return reason switch {
    Reasons.Case1 => "string1",
    Reasons.Case2 => "string2",
    _ => throw new ArgumentException("Invalid argument")
};

Solution

  • In the example you give there's not a lot in it really. However, switch expressions are useful for declaring and initializing variables in one step. For example:

    var description = reason switch 
    {
        Reasons.Case1 => "string1",
        Reasons.Case2 => "string2",
        _ => throw new ArgumentException("Invalid argument")
    };
    

    Here we can declare and initialize description immediately. If we used a switch statement we'd have to say something like this:

    string description = null;
    switch(reason)
    {
        case Reasons.Case1: description = "string1";
                            break;
        case Reasons.Case2: description = "string2";
                            break;
        default:            throw new ArgumentException("Invalid argument");
    }
    

    One downside of switch expressions at the moment (in VS2019 at least) is that you can't set a breakpoint on an individual condition, only the whole expression. However, with switch statements you can set a breakpoint on an individual case statement.