1

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

        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
        }

我觉得第一个更具可读性,因为您可以清楚地看到客户端是另一个状态,但这也使代码更长,有时我真的无能为力,只能在第三种情况。有确定的更好的解决方案吗?

4

5 回答 5

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) 自编写原始代码以来,已将一个值添加到枚举中。在任何一种情况下,都需要开发人员的关注,而不是处理,因此似乎抛出错误来表明这种必要性将是唯一合理的响应。

于 2013-05-03T20:59:39.570 回答
2
switch(this.State)
{
    case NetworkState.Server:
    ...
    default: throw new ArgumentException();
}

如果有人添加另一个NetworkState并且不知道此方法,它会使其更安全。

于 2013-05-03T21:00:03.560 回答
1

我认为这些选项的最佳组合是:

    if (this.State == NetworkState.Server)
    {
        //...
    }          
    else // State == Client
    {
        //...
    }
于 2013-05-03T20:59:44.060 回答
0

这取决于。当值只能是布尔值时,if else总是更好。

这很丑:

if (true){
  [...]
else if (false){
  [...]
else{
  // can never happen
}

这个更好:

if (true){ 
  [...]
else{
  [...]
}

但在枚举的情况下,使用 anif似乎不是最好的主意。就像你说的,很高兴知道每个的枚举值branch。我认为 switch 语句可以解决这个问题。

switch(this.State){
  case NetworkState.Server:
    [...]
    break;
  case NetworkState.Client:
    [...]
    break;
  default:
    // if this can't happen, how about throwing an exception?
}
于 2013-05-03T21:01:53.113 回答
0

switch case语句怎么样?

switch(this.State)
{
    case NetworkState.Server:
    //...
    break;

    case NetworkState.Client:
    //...
    break;

    default: 
    //some error throwing or printing
}
于 2013-05-03T21:02:07.480 回答