【发布时间】:2016-07-11 14:21:27
【问题描述】:
我有一个类来处理传入的无线消息并解析它们。根据命令的输出,我需要处理一些 UI 修改,例如突出显示标签、向文本框添加文本等。我使用的第一个选项是:
void IncomingMessageIfStatements(Message msg, Host host)
{
byte resp;
if (ParseMessageOptionOne(msg, out resp))
{
// Do some windows form stuff
}
else if (ParseMessageOptionTwo(msg, out resp))
{
// Do some windows form stuff
}
else if (ParseMessageOptionThree(msg, out resp))
{
// Do some windows form stuff
}
}
private bool ParseMessageOptionOne(Message msg, out byte resp)
{
throw new NotImplementedException();
}
private bool ParseMessageOptionTwo(Message msg, out byte resp)
{
throw new NotImplementedException();
}
private bool ParseMessageOptionThree(Message msg, out byte resp)
{
throw new NotImplementedException();
}
这行得通,但我会有更多else if 声明,它可能会变得丑陋。我看的下一个方法是:
void IncomingMessageSwitchStatements(Message msg, Host host)
{
byte resp = 0;
byte someByte = 0;
bool output = false;
switch (someByte)
{
case 1:
output = ParseMessageOptionOne(msg, out resp);
break;
case 2:
output = ParseMessageOptionTwo(msg, out resp);
break;
case 3:
output = ParseMessageOptionThree(msg, out resp);
break;
default:
//handle exception here
break;
}
if (output && resp == 0x01)
{
UpdateUiFromHere();
}
}
private void UpdateUiFromHere()
{
// handle UI updates here
}
这看起来更干净并且可以按预期工作。但后来我开始关注Dictionary<byte, Func<bool>>,并认为这可能是解决处理传入的多个条件(可能是 20 个)的更好方法。
对于我应该采用的最佳实践有什么建议吗?
【问题讨论】:
-
switch版本将始终执行默认分支...你说它按预期工作? -
似乎“if else”块在逻辑上与“switch case”块不同。 ParseMessageOptionX 返回 bool,someByte 来自哪里?
-
switch 比 if/else if/else 好。但是,如果有大量的条件,那么查找表(字典)将使您的代码更简洁。
-
你应该看看programmers.stackexchange.com/questions/206816/…我认为如果你有超过10个if-condition或case-switch,你可以用多态替换它们
-
@DiligentKeyPresser 出于安全原因,我提取了一些代码,但
case是为了清楚起见。case显然是基于来自消息的byte。
标签: c# winforms if-statement dictionary switch-statement