在 C# switch 表达式中使用块?

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)

但不要这样做......

  • 为什么“但不要这样做......”?它看起来仍然比旧的 switch 或许多 if 语句更好。 (3认同)
  • @ca9163d9 你真的认为这看起来更好,还是只是因为它是一个新功能并且很闪亮?我不喜欢这个,因为 1. switch 表达式是为表达式而不是语句块设计的。2. 你需要在其中的某个地方使用“Action”这个词,这可以被认为是噪音并且不雅观。请注意,我并不是说您根本不应该使用 switch 表达式(以防您误解)。有些情况适合使用 switch 语句,有些情况适合使用 switch 表达式。 (2认同)

reP*_*hat 10

您还可以引入本地函数(C# 7.0 及更高版本)并执行以下操作:

response switch
{
    "yes" => DoSomething(),
     _ => DoNothing()
};

void DoSomething()
{
    someDir.Delete();
    ... MoreActions
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*sch 6

根据文档:主体是表达式,而不是语句。

你可以做这样的事情:

Action fn = response switch
{
    "yes" => () => { BlockTest(); },
     _ => () => { OldTest(); }
};
Run Code Online (Sandbox Code Playgroud)

  • 因为 switch 表达式不是设计成这样使用的吗? (2认同)