2013-05-03 61 views
1

我想知道在这些情况下有什么更好的解决方案,或者编码标准在公司中对此有何评论?哪个是双向if-else语句的最佳/标准做法

 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

如果你正在处理一个枚举,你不能确保'Client'处于'else'块的价值,因为你可以收到有问题的枚举值无效。您可以使用'switch'语句而不是使用'if/else',并在'default'子句中引发异常。 – Lee 2013-05-03 20:59:38

+0

@Lee即使枚举只有两个值,如这里? – Innkeeper 2013-05-03 21:00:46

+0

从现在开始,当有人向您的代码中引入新的NetworkState.SomethingElse时会发生什么? – 2013-05-03 21:03:08

回答

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

'默认'是最重要的 - 通过在这里抛出/报告错误,您可以检测到已添加新枚举值并且未更新代码来处理它的情况。 – 2013-05-03 21:04:04

+0

我现在看到原因,谢谢。开关最老的建议,所以这被接受。 – Innkeeper 2013-05-03 21:08:18

+0

@JasonWilliams - 查看更新。 – smartcaveman 2013-05-03 21:09:54

1

我觉得这些选项的最佳组合是:

if (this.State == NetworkState.Server) 
    { 
     //... 
    }   
    else // State == Client 
    { 
     //... 
    } 
2
switch(this.State) 
{ 
    case NetworkState.Server: 
    ... 
    default: throw new ArgumentException(); 
} 

它使之更加安全,以防有人又增加了NetworkState,不知道这个方法。

0

这取决于。当值只能是布尔值时,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? 
} 
0

如何使用switch case语句?

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

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

    default: 
    //some error throwing or printing 
}