Как заставить перечисление [Flags] и case переключаться вместе?
Как заставить перечисление [Flags] и case переключаться вместе? Очень желательно, чтобы все выглядело просто. Подобные вопросы задавались много раз, но никогда напрямую не перечислялись [Flags].
Если M1 установлен, выполнить операцию 1,
если М2 установить выполнить операцию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#?
2 ответа
Это будет выполняться для любого установленного бита
например
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
}
}
Вы не можете сделать это с switch
в C#, поскольку после выполнения дела, никакое другое дело не будет выполнено.
Вы можете думать о switch
заявление как более короткий способ написать if... else if... else...
конструкции - где каждый case
является if
и default
это последний 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
}