有没有理由我不应该通过测试他们的产品来测试0的一组变量?

iam*_*eed 4 c# optimization if-statement

有没有理由我不应该通过测试他们的产品来测试0的一组变量?

通常在我跨不同语言的编码中,如果它们都由零组成,我将测试一组变量来做某事.

例如(c#):

if( myString.Length * myInt * (myUrl.LastIndexOf(@"\")+1) == 0 )
Run Code Online (Sandbox Code Playgroud)

代替:

if( myString.Length == 0 || myInt == 0 || myUrl.LastIndexOf(@"\") < 0)
Run Code Online (Sandbox Code Playgroud)

有没有理由我不应该这样测试?

Dan*_*ann 9

你不应该这样做,因为你所做的事情并不明显.代码应该清晰,易读且易于维护.

这很聪明,但它会让下一个看你的代码的人必须通过这种方式"破译"你的意图.

  • @DanielMann实际上可能不是微优化.逻辑运算符的使用允许短路.如果其中一个操作做了类似的事情,比如去数据库获取它的值,那么能够跳过那个检查是一个非常大的交易. (2认同)

Tim*_* S. 9

这有几个原因.一切都很重要,而且没有特别的顺序.

  • 短路.在您的第一个示例中,即使它们不需要,也将评估所有三个事物.在某些情况下,这可能是一个真正的问题:短路很好,因为你可以做一些事情,比如if (myObj != null && myObj.Enabled)不抛出异常
  • 正确.是myString.Length * myInt * myUrl.LastIndexOf(@"\") == 0实际上相当于在所有实际情况下if( myString.Length > 0 && myInt != 0 && myUrl.LastIndexOf(@"\") <= 0)?我不确定.我对此表示怀疑.我确信我可以通过一些努力来解决这个问题,但为什么我必须首先考虑?这让我想到......
  • 清晰度.由于传统的方法是使用单独的语句,并且&&将来阅读此代码的任何人都将更难理解它正在做什么.并且不要找借口说"我将是唯一一个阅读它的人",因为在几个月或几年内,你可能已经忘记了写作时的想法和惯例,并且正在阅读就像其他人一样.