我想知道在这些情况下什么是更好的解决方案,或者编码标准对公司的说法是什么?
if (this.State == NetworkState.Server)
{
//...
}
else if (this.State == NetworkState.Client)
{
//...
}
else
{
//some error throwing or printing
}
或
if (this.State == NetworkState.Server)
{
//...
}
else
{
//sure its client here
}
我觉得第一个更具可读性,因为你可以清楚地看到客户端是另一个状态,但它也使代码更长,有时候我做的不仅仅是打印“这应该永远不会发生“在第三种情况下。有没有明确的更好的解决方案?
答案 0 :(得分:9)
在这里使用switch语句更有意义。
switch(this.State)
{
case NetworkState.Server:
//...
break;
case NetworkState.Client:
//...
break;
default:
//some error throwing or printing
throw new NotSupportedException(string.Format("An unsupported enumeration value {0}.{1} was used. Processing for the case is not supported because it has not been explicitly implemented.", typeof(NetworkState).Name, this.State), new NotImplementedException());
}
它使事实明确,您考虑的唯一条件是枚举值。使用if语句,您必须阅读每个附加的“if”以确保没有其他条件影响逻辑。
编辑:我刚刚注意到您问题的一部分,询问如何处理不匹配的案例。我在那里添加了一个解释问题的例外。我喜欢这样做,因为在现实中 - 我唯一能够达到default
条款的时间是:(1)我忘记了一个选项,并且需要实现它;或者,(2)自编写原始代码以来,在枚举中添加了一个值。在任何一种情况下,都需要开发人员注意,而不是处理,所以似乎抛出一个错误来指示这种必要性将是唯一合理的回应。
答案 1 :(得分:2)
switch(this.State)
{
case NetworkState.Server:
...
default: throw new ArgumentException();
}
如果有人添加了另一个NetworkState
并且不知道此方法,则会更安全。
答案 2 :(得分:1)
我认为这些选项的最佳组合是:
if (this.State == NetworkState.Server)
{
//...
}
else // State == Client
{
//...
}
答案 3 :(得分:0)
这取决于。当值只能是bool时,if else
总是更好。
这太丑了:
if (true){
[...]
else if (false){
[...]
else{
// can never happen
}
这样更好:
if (true){
[...]
else{
[...]
}
但是使用if
的枚举可能看起来不是最好的主意。就像你说的那样,很高兴知道每个branch
的枚举值。我认为switch语句解决了这个问题。
switch(this.State){
case NetworkState.Server:
[...]
break;
case NetworkState.Client:
[...]
break;
default:
// if this can't happen, how about throwing an exception?
}
答案 4 :(得分:0)
切换案例陈述怎么样?
switch(this.State)
{
case NetworkState.Server:
//...
break;
case NetworkState.Client:
//...
break;
default:
//some error throwing or printing
}