【问题标题】:does the order of the operands to comparison operators matter? [duplicate]比较运算符的操作数顺序重要吗? [复制]
【发布时间】:2017-05-31 19:07:28
【问题描述】:

当检查一个对象是否等于某个值时,是否有一些区别:

myObject == someValue

someValue == myObject

换句话说,比较运算符的操作数的顺序是否重要?是编码风格的问题吗?

我一直在使用前者,但一个项目一直在使用我从未见过的后者。

例如

if (data != null)
    data.Write(writer);

if (null != data)
    data.Write(writer);

我一直在使用前者,而项目中的一些成员一直在使用后者。

谢谢。

【问题讨论】:

  • 唯一的区别在于可读性。当硬编码值位于比较运算符的右侧时,大多数人会发现它更具可读性。
  • 重要,不重要,顺序。 (null != data) 俗称“尤达条件”。五年前,我异想天开地在一个嘶嘶声中使用了一个来面试我现在的工作,他们仍然给我废话。我通常只会在另一个操作数是长方法调用或类似的情况下这样做,并且将常量放在首位有助于提高可读性,但在这种情况下,也许你应该将其分配给本地。

标签: c# coding-style


【解决方案1】:

我认为没有任何区别,或者至少没有编译器不会针对同一事物进行优化的区别。

您所观察到的通常称为Yoda Conditions。 (因为朗读时条件听起来的语言风格,与尤达说话的方式相似。)而且它们主要是个人喜好问题。

提倡它们的人很快就会指出优点,例如:

if (something = true)

会产生运行时错误,而:

if (true = something)

会产生编译器错误并立即被捕获。尽管我会反驳说单元测试应该在错误发生之前就发现错误。并且同样会争辩说,团队中其他程序员的任何困惑(即使只是你发布这个问题的闲散好奇心)都会浪费在项目上的时间。但我离题了:)

【讨论】:

  • 另外,if( something = null) 应该会生成警告。
  • @MikeNakis:可能取决于编译器和语言,但我同意应该是的。
  • @MikeNakis 它不会产生任何警告,它会产生编译器错误,因为表达式不会在 if 语句中解析为布尔值。如果代码是something = true那么代码实际上可以编译,如果是代码,它不会产生警告。
  • @Servy:啊,好点子。我会更新答案。
  • 如果something 的类型是一个重载truefalse 运算符或隐式转换为bool 的类,则实际上可以编译该行代码。但是如果你有一个班级这样做,你可能会遇到更深层次的问题。
【解决方案2】:

在我看来它们是一样的。如果我说:

(1 != 2) = true

(2 != 1) = true

两者都会得到相同的答案。我能想到的唯一重要的事情是,如果你工作的地方有一个需要一种或另一种方式的编码标准(我从未见过这样的编码标准)。我会坚持你目前正在做的项目的方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    • 2016-11-12
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多