在 C# 中,如何使用 Switch 对非常量字符串值执行模式匹配?
Posted
技术标签:
【中文标题】在 C# 中,如何使用 Switch 对非常量字符串值执行模式匹配?【英文标题】:In C#, How To Perform Pattern Matching With Switch For Non-Constant String Value? 【发布时间】:2021-12-03 14:02:58 【问题描述】:在 C# 中,如何使用 Switch 对非常量字符串值进行模式匹配?
我希望能够在 switch 语句中使用非常量字符串变量作为匹配目标。
我有下面的代码,但我在case expectedValue:
遇到错误CS0150: A constant value is expected
public bool UseStandardSwitch(string inputValue)
var expectedValue = "SomeValue";
bool result = default;
var DoSomething = () => result = true; ;
switch (inputValue)
case expectedValue:
DoSomething();
break;
default:
break;
return result;
有没有办法达到类似的效果?
【问题讨论】:
为什么要使用开关,对于一个简单的if
来说似乎是一项工作,不是吗?
nvoigt,该代码并非旨在反映实际用例。目标是突出语法。
【参考方案1】:
无需引入变量(如您的回答)-您可以将 discard 与 case guard 一起使用:
public bool UseStandardSwitch(string inputValue)
var expectedValue = Console.ReadLine()!;
Func<bool> DoSomething = () => true;
return inputValue switch
_ when inputValue.Equals(expectedValue) => DoSomething(),
_ when inputValue.Equals(expectedValue + "1") => DoSomething(),
_ => throw new ArgumentException(),
;
【讨论】:
在哪个版本的 C# 上引入了这个? @Error404Brainnotfound 我相信从 C# 8 开始。 非常感谢!现在我知道我不能在我的项目中使用它:')【参考方案2】:您可以使用the var pattern 来完成类似的事情。
试试这个:
public bool UsePatternMatching(string value)
var DoSomething = () => true;
return value switch
var str when str.Equals("SomeValue") => DoSomething(),
_ => throw new ArgumentException(),
;
更新:请参阅 Stron 的帖子以获得改进的答案。
【讨论】:
这不是switch
,不过...这是伪装成switch
的if-else。它还需要为“switch”的每个分支声明一个新的变量,这是低效的。
希望读者能够幸运地处理变量声明对性能开销有重要影响的代码:)
我同意这不太可能是一个问题,但最好准确地解释幕后所做的事情,以便让读者为他们的用例做出最合适的决定。现在添加到 C# 中的许多语法糖都隐藏了很多复杂性。以上是关于在 C# 中,如何使用 Switch 对非常量字符串值执行模式匹配?的主要内容,如果未能解决你的问题,请参考以下文章