这是双向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
        }

我觉得第一种更具可读性,因为你可以清楚地看到客户端是另一种状态,但它也会使代码更长,有时我真的只能在第三种情况下打印"这不应该发生"。有没有更好的解决方案?

这是双向if-else语句的最佳/标准做法

在这里使用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
}