【问题标题】:Why does Visual Studio 2019 recommend a switch expression instead of a switch statement?为什么 Visual Studio 2019 推荐使用 switch 表达式而不是 switch 语句?
【发布时间】:2020-07-29 12:27:33
【问题描述】:

Visual Studio 2019 建议将我编写的 switch 语句转换为 switch expression(两者都包含在下面的上下文中)。

对于像这样的简单示例,将其编写为表达式是否有任何技术或性能优势?例如,这两个版本的编译方式是否不同?

声明

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

表达式

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

【问题讨论】:

  • 在您的示例中,我想说唯一的优点是后者不那么冗长,因此更具可读性(一旦您习惯了新语法)。对于扩展使用,一大优势是您可以直接从 switch 返回一个值 - 更少的程序代码。
  • 更易读,我想说
  • 您对技术转换语句与表达的优缺点的研究如何应用?因为否则您要求复制 SO 内容并且您没有显示任何研究。
  • 虽然case Reasons.Case1 是多余的,但就我个人而言,我更喜欢写出default: 而不是必须凭直觉知道_ => 意味着默认...该语句实际上比表达式稍早一点。

标签: c# switch-statement switch-expression


【解决方案1】:

在您给出的示例中,实际上并没有太多内容。但是,switch 表达式对于在一个步骤中声明和初始化变量很有用。例如:

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

这里我们可以立即声明和初始化description。如果我们使用 switch 语句,我们必须这样说:

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

目前 switch 表达式的一个缺点(至少在 VS2019 中)是您不能在单个条件上设置断点,只能在整个表达式上设置断点。但是,使用 switch 语句,您可以在单个 case 语句上设置断点。

【讨论】:

  • 虽然看起来确实比普通开关好,但有什么好处吗?比如说,你叫它一百万次,它会更快吗?
  • @Sheradil 有可能这两个版本都会产生基本相同的 IL,所以我怀疑是否有性能优势。
猜你喜欢
  • 2021-04-15
  • 1970-01-01
  • 2010-10-01
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-28
相关资源
最近更新 更多