C#If语句的设计模式或(文献)最佳实践

C#If语句的设计模式或(文献)最佳实践,c#,C#,我理解这个问题的答案是否主观,(我没有发现类似的问题),但我的问题如下: 我在互联网/文献中看到了来自不同来源的代码片段,其中一个来自我项目中的团队成员。通常,他们中的一些人会选择一种类似于 if(a == true && b == false || c == true) {} 在我看来,if语句可能是 如果a为真,b为假或c为真 或者(口译员可能理解的内容,甚至对我来说) 如果a为真,b为假或c为真 由于我的这种冲突,我必须正确地思考什么是陈述 A) 执行或B)最初是指代

我理解这个问题的答案是否主观,(我没有发现类似的问题),但我的问题如下:

我在互联网/文献中看到了来自不同来源的代码片段,其中一个来自我项目中的团队成员。通常,他们中的一些人会选择一种类似于

if(a == true && b == false || c == true) {}
在我看来,if语句可能是

  • 如果a为真,b为假或c为真

    或者(口译员可能理解的内容,甚至对我来说)

  • 如果a为真,b为假或c为真

  • 由于我的这种冲突,我必须正确地思考什么是陈述 A) 执行或B)最初是指代码编写者,我一直使用自己的模式,以便于他人理解,如下所示

    if(a == true && (b == false || c == true)) {}
    

    或者(更好的可读性,因为我认为括号内的子语句应该是最后一个,而不是第一个)

    现在我错了吗?如果我是对的,有没有支持这种语法的设计模式?尽管我认为这是一个更好的方法,但Resharper却不这么认为,认为它是多余的

    另一方面,我想学习以任何方式更好地编写代码,如果我的队友做得不对,我也应该让他们有机会变得更好,他们的代码也变得更可读(如果这是真的)

    编辑:它不是关于If语句如何工作,或者布尔值或其前导如何工作。它是关于在默认情况下不需要的语句中添加额外的括号(如不需要编码中的注释),但可能是一种有助于更清晰编码的模式(如注释或其他设计模式)。

    查看MSDN上的

    关于您的示例,
    如果(a==true&&b==false | | c==true)
    被计算为
    如果(a为true,b为false)或c为true
    ,因为&的计算顺序高于|

    就可读性而言,我不会明确地评估
    ==true
    ==false

    这是可读性较差,不太干净

    if(a==true&&b==false | | c==true){…}

    这是更可读和更干净

    if(a&&!b|c){…}

    Resharper抱怨,因为如果求值顺序与没有括号的求值顺序完全相同,则无需显式指定求值顺序,例如:

    if((a&&!b)| c){…}
    if(a&&!b | c){…}
    相同,因此额外的括号是多余的,会给代码增加噪音,因此可读性较差

    如果需要显式更改求值顺序,则Resharper不应抱怨,例如:

    if(a&(!b| | c)){…}


    关于设计模式,OOP设计模式并没有让人想到什么。这似乎更适合于函数式编程领域的一些方面,例如模式匹配。

    这是一个非常基于观点的问题,正如您在评论中已经看到的那样

    我更喜欢保留括号以使其更清晰可见,因为我自己有时会在脑海中交换&&和| |的评估顺序

    if((a == true && b == false) || c == true)
    vs
    if(a == true && b == false || c == true)
    
    这给了我一个瞬间的印象,a和b必须是真的,或者只有c是真的。如果我错过了括号,我需要另一个问题:“是&&before | |还是反之亦然?”。有些人需要,有些人不需要

    总是试着用吻——保持简单愚蠢。 如果条件太复杂,最简单的方法是将其封装到函数中:

    if(ObjectIsValid(obj))
    ...
    private bool ObjectIsValid(object obj)
    {
       return obj.Condition1 == true || (obj.IsSpecial && obj.Specialprop == true) || (obj.SomeEnum == Enumvalue.Value && obj.Specialprop == false) ...;
    }
    
    如果首先检查and或or条件,则顺序可能取决于许多因素。如果检查或状况花费的时间最多怎么办?以第一个和第一个为例。如果最不可能满足和条件,该怎么办?放在最后

    这在很大程度上取决于你的处境。主要的一点是在你的团队中保持一种大家都能理解的风格,一种最具可读性、工作性、表现力并为所有解决方案所接受的风格

    …最佳解决方案并不总是最短或最有效的。

    我还支持series0ne的“if(a)>if(a==true)”

    编辑: 我还想提到另一个困扰我的问题

    if(someCondition &&
       someOtherCondition ||
       someThirdCondition)
    and
    if(someCondition
       && someOtherCondition
       || someThirdCondition)
    

    第二个对我来说似乎更具可读性,因为我知道与&&&&在同一行中的是什么。但在这一点上,肯定也有足够的ppl对可读性有另一种看法。

    这里没有歧义<代码>&的优先级高于
    |
    我个人不想记住优先级,我总是用括号来表示这样的和/或混合-那么我可以肯定。Lyosha Korogoda的可能副本问题很简单:“为什么只在它有不同的含义时才放括号,而不是在没有括号的情况下含义保持不变?”->可能的原因:它应该变得更具可读性,作者不必添加额外的注释(部分)来解释,也不必简单地用代码写下自己的意图,而无需让其他人再次检查代码是否存在可能的逻辑错误。虽然知道逻辑运算符的优先级很好,对于仍在学习并需要理解您的逻辑的初级开发人员来说,大量使用括号仍然很有帮助。从您的第二个链接“下面的部分列出了从最高优先级到最低优先级的C#运算符。每个部分中的运算符共享相同的优先级。”-因此不需要链接到其他语言的文档。就像我写的那样,我可以解释代码的含义。问题在于可读性和可能的设计模式,以帮助更好、可能更干净的编码。最重要的是,我知道缩短布尔语句,在我看来,这只是一个示例。@在可读性和干净编码方面的半步,如果(a&&!b)是c,那么许多其他开发人员的
    
    
    if(ObjectIsValid(obj))
    ...
    private bool ObjectIsValid(object obj)
    {
       return obj.Condition1 == true || (obj.IsSpecial && obj.Specialprop == true) || (obj.SomeEnum == Enumvalue.Value && obj.Specialprop == false) ...;
    }
    
    if(someCondition &&
       someOtherCondition ||
       someThirdCondition)
    and
    if(someCondition
       && someOtherCondition
       || someThirdCondition)