【问题标题】:Confusing If Statement?令人困惑的 If 语句?
【发布时间】:2010-03-09 08:43:32
【问题描述】:

我总是使用 If 语句(在 C# 中)作为(1.替代);

if (IsSuccessed == true)
{
   //
}

我知道没有必要把“== true”写成(2. Alternative));

if (IsSuccessed)
{
   //
}

但是,我使用它是因为它更具可读性并且不会导致性能问题。当然,这是我的选择,我知道许多软件开发人员更喜欢第一种选择。什么是最好的用法,为什么?

【问题讨论】:

  • 就个人而言,我会选择将IsSuccessed 重命名为SucceededIsSuccess,但这是另一回事。
  • IMO 第一个 alt 出现在新手编写的代码中,而经验丰富的编码人员则使用第二个。这只是我的观察。
  • 第二种形式使用一段时间后,您会认为它更具可读性。此外,如前所述,第一种形式看起来很业余。你想坚持大众,大多数程序员使用表格#2。
  • 我同意@Zaki 这有点新人的味道

标签: c# java if-statement


【解决方案1】:

我不喜欢第一个选项。它不仅是多余的,而且一个简单的错字会引入一个错误。

考虑一下

bool b = false;

if (b = true) {
   Console.WriteLine("true");
}

显然代码会输出“true”,但这可能不是程序员的本意。

幸运的是,像 Resharper 这样的工具会对此发出警告,但它会使用默认设置 (*) 进行编译。

直接使用 bool 将完全消除该问题。

(*) 公平地说,VS 也会对此发出警告,如果你打开警告作为错误,它甚至不会编译。

【讨论】:

  • 好答案。虽然我同意其他基于风格的答案,但这提供了省略不必要比较的实际理由。
  • 虽然这会编译,但您确实会收到警告,即使 没有 Resharper -“条件表达式中的赋值始终是常量;您的意思是使用 == 而不是 = 吗? "
  • 保护自己免受滑手的伤害。
  • @Nick:是的,如果你打开警告作为错误 VS 会阻止你这样做,但使用选项二你不必做任何事情来避免潜在的错误。
  • @Brian:您的回答暗示您需要使用 Resharper 之类的工具才能获得警告;尼克只是指出事实并非如此。无论如何,我同意你其余的回答。
【解决方案2】:

我个人会选择第二种选择。它读起来更自然,表明程序员实际上知道内置的bool 类型,它是一等公民。

【讨论】:

  • 如果它变成“假”而不是“真”怎么办。该语句更改为第二种选择。是不是很混乱?
  • @Netside:你仍然只需要做一个if (!IsSuccessed) ...非常紧凑的imo。
  • 但是,我不相信可读性。你真的认为它更具可读性吗?
  • 那么设计有问题。您应该避免固有的负布尔值:使用 isOkay 代替 isFaulty,使用 hasMembers 代替 hasNoMembers,使用 isInWorkMode 代替 isInFaultMode 等。避免双重和更深层次的否定,如火:将你的头绕在if(!noInitErrors) 周围。围绕if(!isInFaultMode) 设计系统作为标准检查的一个错误已经让我好几次了。
【解决方案3】:

完全依赖样式。严重地。随心所欲地做你自己的东西,无论你的工作风格是什么。

【讨论】:

    【解决方案4】:

    我声称赞成第一种选择的人对布尔逻辑有粗略的掌握。他们可能在理智上“理解”它,但他们当然不会去摸索它;他们还没有内化这种思维方式。

    毕竟,每个人都使用以下成语吗? “如果明天下雨是假的,我们可能会去游泳”——,当然不是。 没有人这样说,太荒谬了。什么论据支持这种成语在应用于编程(而不是自然)语言时突然变得清晰的说法?

    【讨论】:

      【解决方案5】:

      我更喜欢第二种选择。我认为它更具可读性,但如果您出于某种原因需要使用 Boolean?,第一个替代方案的优势是保持不变。

      【讨论】:

      • 不,我在尝试时遇到编译器错误。 “不能隐式转换类型'bool?'到 'bool' ..."
      【解决方案6】:

      如果布尔值的名称清楚地表明它是什么,那么我总是会选择版本 2。但是,有时您会遇到一个无法更改的特别钝的变量名称,至少,现在无法更改...重构一切都很好,但是在对代码进行功能更改时,我也尽量避免重构过多。

      例如:

      if (!NoDropDownInHeader == true)
      {
        // Activates when there *is* a dropdown in the header)
      }
      

      我实际上已经在生产代码中看到了这个特定示例,并将其简化为:

      if (NoDropDownInHeader == false)
      {
       // Activates when there *is* a dropdown in the header
      }
      

      而且我个人认为这两个示例都比:

      if (!NoDropDownInHeader)
      {
       // Activates when there *is* a dropdown in the header
      }
      

      注意: 是的,我知道该变量命名错误,但是在它存在的多个地方更改它超出了我所做的更改范围,因为会影响的地方数

      【讨论】:

      • 同意 - 我总是喜欢一个“积极的”变量,即在这种情况下放弃“否”。使它更容易阅读。双重否定不是好事!
      【解决方案7】:

      我以前写“== true”,因为我认为它更清晰,更明确,但决定改变。现在它似乎总是更清晰,你会习惯它。

      【讨论】:

      • 我记得刚开始编程时也做过同样的事情。
      【解决方案8】:

      我也会满足于您的第二个选择。我认为没有必要写

      if (IsSuccessed == true) 
      { 
         // 
      } 
      

      事实上,我完全不喜欢将 == true 用于布尔值,因为它没有额外的价值。 并且:您必须输入更少的字符,这显然是一个优势:p。 老实说,我还将布尔值重写为 bSuccessed,因为它是一个布尔值。

      【讨论】:

      • 我认为如果你把它读成“如果成功”而不是“如果成功”,它会更具可读性。对我来说似乎更自然。
      • 啊哈,程序员必须写自然语言? :) 为变量使用前缀很聪明。这样,您无需搜索代码即可快速查看变量的类型。我知道在像 VS 这样的环境中你可以鼠标悬停,但通常使用前缀
      • 说真的,bSuccessed ?几年前我们以为我们已经完成了匈牙利符号。 'b' 赋予了哪些尚未存在的“价值”?
      • 是的,请停止匈牙利的事情。如果您的代码显示if(Success),而您不得不怀疑Successs 是否是bool,我会说您还有其他问题...
      • "但通常使用前缀" ...您可以参考一些统计数据吗? :)
      【解决方案9】:

      这两个表达式在 C# 中是等价的,但要注意它们不是其他语言。

      例如,在 C++ 中,第一个选项接受值为 true 的布尔值。 IsSuccessed 上的任何其他值都会使条件无效。

      第二个选项接受任何“真实”的值:像 1 或任何非零的值也被认为对 if 有效。

      因此这些条件将成立:

      // Truthy validation (second option)
      if(1) {...} //validates
      if(2) {...} //validates
      

      而这些其他人不会:

      // Equals to true validation (first option)
      if(1==true) {...} // does not validate
      if(2==true) {...} // does not validate
      

      同样,这不适用于 C#,因为它只接受 ifs 上的布尔值。但请记住,其他语言不仅接受布尔值。

      【讨论】:

        【解决方案10】:

        更多的输入意味着更多的错误机会。选项2一路...

        【讨论】:

          【解决方案11】:

          我在开始编程时使用第一个选项,但有点习惯了第二个选项。它还可以节省输入额外字母的时间。

          【讨论】:

            【解决方案12】:

            我看到最多的是:(我做的)

            if (IsSuccessed)
            {
               //
            }
            

            作为 C++ 中的替代品,对于 C#,它不需要(见评论):

            if (true == IsSuccessed)
            {
               //
            }
            

            另一种方法是防止自己犯了分配而不是比较的错误。 (= vs ==)

            【讨论】:

            • 您不应该应用其他语言的编码约定,这些约定旨在解决不存在的问题。在 C# 中,您会收到警告:条件表达式中的赋值始终是常量;您的意思是使用 == 而不是 = 吗?。 C# 很棒。
            • 嗯不错不知道。我看到同事在 C++ 中使用它,我自己总是使用第一个。
            【解决方案13】:

            我会选择第二个。至少对我来说更容易。在第一种选择中,我总是想知道为什么要进行比较。检查左侧的类型,以确保没有开发人员在 acid 上重载 == 运算符,在他的类和 bool 选项之间进行比较。
            第一个也会导致错误,第二个不会。
            if(a) 可能需要在第一个版本中更改为if(a||b)if(a&&b),它可能最终成为if(a == true || b)if(a == true && b) 在前者b 是多余的,后者等于if(a==b)

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2017-01-17
              • 2016-08-31
              • 1970-01-01
              • 1970-01-01
              • 2011-03-29
              • 2021-12-21
              • 1970-01-01
              相关资源
              最近更新 更多