这是双向if-else语句的最佳/标准做法
本文关键字:最佳 标准 语句 if-else | 更新日期: 2023-09-27 18:11:58
我想知道在这种情况下,什么是更好的解决方案,或者公司的编码标准对此有什么看法?
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
}
我觉得第一种更具可读性,因为你可以清楚地看到客户端是另一种状态,但它也会使代码更长,有时我真的只能在第三种情况下打印"这不应该发生"。有没有更好的解决方案?
在这里使用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(自编写原始代码以来,已将值添加到枚举中。在任何一种情况下,都需要开发人员的关注,而不是处理,因此似乎抛出一个错误来表明这种必要性将是唯一合理的回应。
switch(this.State)
{
case NetworkState.Server:
...
default: throw new ArgumentException();
}
它使它更安全,以防有人添加另一个NetworkState
而不知道该方法。
我认为这些选项的最佳组合是:
if (this.State == NetworkState.Server)
{
//...
}
else // State == Client
{
//...
}
这取决于情况。当值只能是布尔时,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?
}
切换用例语句怎么样?
switch(this.State)
{
case NetworkState.Server:
//...
break;
case NetworkState.Client:
//...
break;
default:
//some error throwing or printing
}