懒惰"和"表达评价

时间:2018-01-06 09:50:35

标签: c# lazy-evaluation boolean-expression

我一直在使用以下代码块询问用户输入并在控制台应用程序中检查其有效性。

do
{
    Console.Write("Enter X value:");    // prompt
} while (!(int.TryParse(Console.ReadLine(),out temp) && (temp<=10) && (temp>=0))); // repeat if input couldn't be parsed as an integer or out of range

&#34;&amp;&amp;&#34;是一个记录在案的功能吗? (和)表达评估是懒惰的吗?即:如果第一个操作数为假,那么它不会解析第二个操作数?我可以在生产版本中依赖它吗?我能指望它在其他编译器中表现相同吗? 这是我在PPCG.SE中学到的东西

此外,可以使块更易于阅读或简化为oneliner吗?

2 个答案:

答案 0 :(得分:0)

  

“&amp;&amp;”是一个记录在案的功能吗? (和)表达评估   懒惰?

Yes as mentioned on the C# reference page:

条件AND运算符(&amp;&amp;)执行其bool操作数的逻辑AND,但仅在必要时仅计算其第二个操作数。换句话说,它是一个短路运算符

  

我可以在生产版本中依赖它吗?我可以期待它吗?   在其他编译器中表现相同吗?

是的,它应该始终表现相同。

  

此外,可以使块更易于阅读或简化为   一个oneliner?

除了删除一些冗余参数外,您只能使用一行来简化此操作。

然而,您可以通过将(temp<=10) && (temp>=0)的逻辑隐藏到某种方法中来使其更具可读性,例如:

public static bool IsValidRange(int temp) =>  temp >= 0 && temp <= 10;

然后你的状况变为:

while (!(int.TryParse(Console.ReadLine(), out temp) && IsValidRange(temp)));

现在,该方法的名称将显示为问题语句IsValidRange

答案 1 :(得分:0)

以下是C#语言规范中涉及&&||的相关部分:

  

第7.12节条件逻辑运算符

     

&amp;&amp;和||运营商是&amp;的有条件版本。和|   运营商:

     
      
  • 操作x&amp;&amp; y对应于操作x&amp; Y,   除了仅在x不为假时才计算y。
  •   
  • 操作x || y对应于操作x | y,除了仅评估y   如果x不是真的。
  •   

由于它在规范中,无论您使用何种编译器,它都应该表现相同。如果没有,那么您使用的编译器不被视为“C#”编译器。 :)