switch 表达式中的多个语句:C# 8
Multiple statements in a switch expression: C# 8
Switch 表达式是在 C# 8 中引入的。代码库中有很多地方可以用这种新风格重写。
例如,我有一些代码,用于从字节流中解析数据包:
switch (command)
{
case Command.C1:
return new P1();
case Command.C2:
return new P2();
default:
stream.Position++;
return null;
}
问题是 - 它无法转换为像
这样的开关表达式
return command switch
{
Command.C1 => new P1(),
Command.C3 => new P2(),
_ => { stream.Position++; return null; }
};
我首先想到的是使用 Func<>
,它编译:
return command switch
{
Command.C1 => new P1(),
Command.C3 => new P2(),
_ => new Func<AbstractPacket>(() => { stream.Position++; return null; })()
};
F# 已经允许在每个分支中包含多个语句的代码:
match command with
| Command.C1 -> Some(P1() :> AbstractPacket)
| Command.C2 -> Some(P2() :> AbstractPacket)
| _ ->
stream.Position <- stream.Position + 1
None
现在我无法使用 switch 语句,但是是否可以选择将其写成 switch 表达式而不用任何奇怪的技巧?
您唯一支持的选择是像您一样的功能。有关详细信息,请参阅 this article。他的例子:
var result = operation switch
{
"+" => ((Func<int>)(() => {
Log("addition");
return a + b;
}))(),
"-" => ((Func<int>)(() => {
Log("subtraction");
return a - b;
}))(),
"/" => ((Func<int>)(() => {
Log("division");
return a / b;
}))(),
_ => throw new NotSupportedException()
};
仅仅因为 switch 表达式是新的并不意味着它们是所有用例的最佳选择。它们并非旨在包含多个命令。
与:
TRes Call<TRes>(Func<TRes> f) => f();
看起来像:
return command switch {
Command.C1 => new P1(),
Command.C3 => new P2(),
_ => Call(() => { stream.Position++; return null; }),
};
或:
var result = operation switch {
"+" => Call(() => {
Log("addition");
return a + b;
}),
"-" => Call(() => {
Log("subtraction");
return a - b;
}),
"/" => Call(() => {
Log("division");
return a / b;
}),
_ => throw new NotSupportedException(),
};
Switch 表达式是在 C# 8 中引入的。代码库中有很多地方可以用这种新风格重写。
例如,我有一些代码,用于从字节流中解析数据包:
switch (command)
{
case Command.C1:
return new P1();
case Command.C2:
return new P2();
default:
stream.Position++;
return null;
}
问题是 - 它无法转换为像
这样的开关表达式return command switch
{
Command.C1 => new P1(),
Command.C3 => new P2(),
_ => { stream.Position++; return null; }
};
我首先想到的是使用 Func<>
,它编译:
return command switch
{
Command.C1 => new P1(),
Command.C3 => new P2(),
_ => new Func<AbstractPacket>(() => { stream.Position++; return null; })()
};
F# 已经允许在每个分支中包含多个语句的代码:
match command with
| Command.C1 -> Some(P1() :> AbstractPacket)
| Command.C2 -> Some(P2() :> AbstractPacket)
| _ ->
stream.Position <- stream.Position + 1
None
现在我无法使用 switch 语句,但是是否可以选择将其写成 switch 表达式而不用任何奇怪的技巧?
您唯一支持的选择是像您一样的功能。有关详细信息,请参阅 this article。他的例子:
var result = operation switch
{
"+" => ((Func<int>)(() => {
Log("addition");
return a + b;
}))(),
"-" => ((Func<int>)(() => {
Log("subtraction");
return a - b;
}))(),
"/" => ((Func<int>)(() => {
Log("division");
return a / b;
}))(),
_ => throw new NotSupportedException()
};
仅仅因为 switch 表达式是新的并不意味着它们是所有用例的最佳选择。它们并非旨在包含多个命令。
与:
TRes Call<TRes>(Func<TRes> f) => f();
看起来像:
return command switch {
Command.C1 => new P1(),
Command.C3 => new P2(),
_ => Call(() => { stream.Position++; return null; }),
};
或:
var result = operation switch {
"+" => Call(() => {
Log("addition");
return a + b;
}),
"-" => Call(() => {
Log("subtraction");
return a - b;
}),
"/" => Call(() => {
Log("division");
return a / b;
}),
_ => throw new NotSupportedException(),
};