回答您的实际问题:
是否有一种在 switch 语句中执行所有 case 的方法。
我想不到一种简洁的方法。
我建议稍微改变模式,将 task
改为标志枚举。
[Flags]
public enum TaskOptions
{
Print = 1,
Save = 2,
SendMail = 4,
//Note that these numbers go up in powers of two
}
您可以像下面这样做:
然后,您可以执行以下操作:
task = TaskOptions.Print | TaskOptions.Save;
if (task.HasFlag(TaskOptions.Print))
{
print();
}
if (task.HasFlag(TaskOptions.Save))
{
save();
}
if (task.HasFlag(TaskOptions.SendMail))
{
sendMail();
}
您不再需要明确担心all
然后,如果您想要添加一个新选项
[Flags]
public enum TaskOptions
{
Print = 1,
Save = 2,
SendMail = 4,
NewOption = 8,
}
task = TaskOptions.Print | TaskOptions.Save;
if (task.HasFlag(TaskOptions.Print))
{
print();
}
if (task.HasFlag(TaskOptions.Save))
{
save();
}
if (task.HasFlag(TaskOptions.SendMail))
{
sendMail();
}
if (task.HasFlag(TaskOptions.NewOption))
{
newOption();
}
Jaymee询问了有关|和&的澄清
请解释task = TaskOptions.Print | TaskOptions.Save的语法。对于这里的管道,我认为它是“或”,但这里没有评估!实际上,单个和号也是如此-以前从未以这种方式使用过
这些是按位运算符。它们逐位比较两个数字,并返回结果。
在我们的示例中,我们使用了4个标志,每个标志由布尔值表示。布尔值可以用1个bit表示。
让我们使用以下缩写:
Print = P
Save = S
SendMail = M
NewOption = N
8 4 2 1
N M S P
我以
task = TaskOptions.Print | TaskOptions.Save
为例。它是一个用于定义任务选项的标志枚举。
0 0 0 1 P is declared as 1 in the enum.
0 0 1 0 S is declared as 2 in the enum.
==========
0 0 1 1 < I've "or'd" these numbers together. They now represent Print AND Save as one option. The number "3" (binary 0011) is equivalent to "print and save"
当我有数字"3",想要知道它是否含有特定标记时,需要使用与该标记进行&
运算。
N M S P
0 0 1 1 //This is P & S
0 0 0 1 //And we want to check if it has "P"
==========
0 0 0 1 < this returns non-zero. it contains the flag!
让我们对 N 做同样的操作
N M S P
0 0 1 1 //This is P & S
1 0 0 0 //And we want to check if it has "N"
==========
0 0 0 0 < this returns zero. This state doesn't contain "N"
由David Arno编辑
补充一下,可以使用字典和for循环代替一系列的if
语句:
private readonly Dictionary<TaskOptions, Action> actions =
new Dictionary<TaskOptions, Action>
{
{ TaskOptions.Print, Print },
{ TaskOptions.Save, Save },
{ TaskOptions.SendMail , SendMail }
};
...
var task = TaskOptions.Print | TaskOptions.Save;
foreach (var enumValue in Enum.GetValues(typeof(TaskOptions)).Cast<TaskOptions>())
{
if (task.HasFlag(enumValue))
{
actions[enumValue]();
}
}
Dictionary<enum, Action>
。您可以使用 foreach 循环遍历所有枚举值,检查是否有条目可用并执行方法。因此,在这种情况下不需要使用 switch。 - Sebastian Schumannprint()
,例如。 - user1017882