为什么 Visual Studio 2019 推荐使用 switch 表达式而不是 switch 语句?
Why does Visual Studio 2019 recommend a switch expression instead of a switch statement?
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 表达式对于一步声明和初始化变量很有用。例如:
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 语句上设置断点。
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 表达式对于一步声明和初始化变量很有用。例如:
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 语句上设置断点。