Yuv*_*l K 6 c# c#-8.0 switch-expression
我找不到解决此问题的文档。(也许我只是不擅长使用谷歌......)我的猜测是答案是否定的,但是我不明白文档中在哪里解决了这个问题。准确地说,我的问题如下。
假设,我想执行这样的事情:
DirectoryInfo someDir = new DirectoryInfo(@".\someDir");
Console.WriteLine($"Would you like to delete the directory {someDir.FullName}?");
string response = Console.ReadLine().ToLower();
response switch
{
"yes" => { someDir.Delete(); ... MoreActions},
_ => DoNothing()
};
Run Code Online (Sandbox Code Playgroud)
我知道我可以通过使用常规 switch 或 if/else 来实现所需的行为,但是我很好奇在这种情况下是否可以使用 switch 表达式。
Swe*_*per 14
但是我不明白文档中在哪里解决了这个问题
这在这里说得很清楚:
这里有几个语法改进:
- 变量出现在 switch 关键字之前。不同的顺序使得在视觉上很容易区分 switch 表达式和 switch 语句。
- case 和 : 元素被 => 替换。它更简洁直观。
- 默认情况被替换为 _ 丢弃。
- 正文是表达式,而不是语句。
{ someDir.Delete(); ... MoreActions} 不是表达式。
但是,正如他们所说,您可以滥用每个功能:)
您可以使 switch 表达式计算为Action,并调用该操作:
Action a = response switch
{
"yes" => () => { ... },
_ => () => { .... }
};
a();
Run Code Online (Sandbox Code Playgroud)
您甚至可以将其简化为单个语句:
(response switch
{
"yes" => (Action)(() => { ... }),
_ => () => { ... }
})();
Run Code Online (Sandbox Code Playgroud)
但不要这样做......
reP*_*hat 10
您还可以引入本地函数(C# 7.0 及更高版本)并执行以下操作:
response switch
{
"yes" => DoSomething(),
_ => DoNothing()
};
void DoSomething()
{
someDir.Delete();
... MoreActions
}
Run Code Online (Sandbox Code Playgroud)
根据文档:主体是表达式,而不是语句。
你可以做这样的事情:
Action fn = response switch
{
"yes" => () => { BlockTest(); },
_ => () => { OldTest(); }
};
Run Code Online (Sandbox Code Playgroud)