如何让[标志]枚举和切换大小写协同工作?



如何使[标志]枚举和切换大小写一起工作?非常希望让它看起来很简单。类似的问题问了很多次,但从未直接针对[标志]枚举。

如果 M1 设置执行操作 1,

如果 M2 设置执行操作2 ,

如果 M1 和 M2 都设置执行操作 1 和 2。

[Flags]
public enum TST
{
M1 =1,
M2 =2,
M3 =4
}
public void PseudoCode()
{
TST t1 = TST.M1 | TST.M3; //1+2= 3
switch( t1)
{
case TST.M1:
{
//Do work if Bit 1 set
}
case TST.M2:
{
//Do work if Bit 2 set
}
case TST.M3:
{
//Do work if Bit 3 set
}
default:
{
//nothing set;
break;
}
}
}

我也非常确定很多人想知道如何让它工作。请求修复 C#?

这将对任何位集执行

例如

ExecuteOnFlagValue(TST.M1 | TST.M3); //1+2= 3

将执行位 1 和 3 的代码

public void ExecuteOnFlagValue(TST value) {
if (value & TST.M1 == TST.M1) {
//Do work if bit 1
}
if (value & TST.M2 == TST.M2) {
//Do work if bit 2
}
if (value & TST.M3 == TST.M3) {
//Do work if bit 3
}
}

你不能在 c# 中使用switch来做到这一点,因为一旦执行了一个案例,就不会执行其他案例。
你可以将switch语句视为编写if... else if... else...构造的较短方法 - 其中每个case都是一个ifdefault是最终else

这意味着以下switch语句:

switch( t1)
{
case TST.M1:
//Do work if Bit 1 set
break;
case TST.M2:
//Do work if Bit 2 set
break;
case TST.M3:
//Do work if Bit 3 set
break;
default:
//nothing set;
break;
}

等效于以下if...else if... else构造:

if(t1 == TST.M1)
{
//Do work if only Bit 1 set
}
else if (t1 == TST.M2)
{
//Do work if only Bit 2 set
}
else if (t1 == TST.M3)
{
//Do work if only Bit 3 set
}
else
{
//nothing set or multiple bits set
}

最新更新