哪个是双向if-else语句的最佳/标准练习

时间:2013-05-03 20:57:25

标签: c# .net

我想知道在这些情况下什么是更好的解决方案,或者编码标准对公司的说法是什么?

        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
        }

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

5 个答案:

答案 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
}