我有一段代码,我想用 switch 替换它:
if( request.SomeParam.Equals("Something1", StringComparison.InvariantCultureIgnoreCase))
{
Execute1();
}
if (request.SomeParam.Equals("Something2", StringComparison.InvariantCultureIgnoreCase))
{
Execute2();
}
throw new ArgumentOutOfRangeException(nameof(Request.Param));
但是,参数不区分大小写,您必须在大小写中输入缩减为小写的字符串,这将导致可读性下降,因为 实际上,“Something1”是一个相当长的字符串SomethingAndSomething,这样在视觉上更容易看到它,而不是在somethingandsomething 中寻找单词边界。
到目前为止,我想出了:
const string SomethingAndSomething = "SomethingAndSomething";
const string SomethingOrSomething = "SomethingOrSomething";
switch(request.SomeParam.ToLowerInvariant())
{
case SomethingAndSomething.ToLowerInvariant():
Execute1();
break;
case SomethingOrSomething.ToLowerInvariant():
Execute2();
break;
default:
throw new ArgumentOutOfRangeException(nameof(Request.Param));
}
但是我不太喜欢这种重复的口头禅.ToLowerInvariant()
,也许还有一些更成功的重构选项?
C# 7.0 版,即 有机会使用该语言的新功能。
所以?
您可以仅将测试部分转换为下或上,而不是将每个选项转换为下。
并立即将所需寄存器的铭文转移到案例中。在这种情况下,只会在开关中而不是在每种情况下都会有演员表。
您可以使用模式匹配。它从 C# 7.0 开始可用。
在这种特殊情况下看起来很麻烦。但在其他情况下,模式匹配可以比其他方法更紧凑。