【问题标题】:difference between" if(condition) int++" and int += "Convert.Toint32(condition)""if(condition) int++" 和 int += "Convert.Toint32(condition)" 之间的区别
【发布时间】:2017-05-25 12:48:58
【问题描述】:

这两种加一的方式

if (Condition) int++;

int+= Convert.Toint32(Condition);

那么以一种或另一种方式写作是否有好处,或者它们基本相同?

【问题讨论】:

  • 一个比另一个更容易阅读。
  • 如果我在代码审查中看到第二个,我会让开发人员更改它。但这就是我。
  • 一个在表演一个分支,另一个在表演。
  • @MikeMcCaughan 我会让他们也改变 first 一个; if 的语句与条件语句在同一行没有业务:)
  • @BradleyDotNET 这不是真正的演员表。 Convert.ToInt32value? Boolean.True: Boolean.False;,其中 True 是 1 的常量,False 是零的常量。仍然是分支。

标签: c# if-statement conditional-statements


【解决方案1】:

将布尔值添加到整数没有任何意义。

是的,它有效,因为转换。但这仍然没有任何意义。这不合逻辑。

程序应该清晰明了,而不是要解决的难题。

【讨论】:

  • @BradleyDotNET 不要忘记 JavaScript! :)
  • 哈哈,别开玩笑了
【解决方案2】:

我的机器从下面的基准测试中得到 7527 毫秒和 5888 毫秒。第一种方法(布尔转换),除了从代码可读性的角度来看只是 糟糕 之外,也比较慢。这是有道理的,这种方法的开销总是 1) 执行从 bool 到 int 的转换,以及 2) 执行加法运算。是的,可能有添加“0”的快捷方式,但这仍然是另一个需要研究的测试。

int sum = 0;

var sw = Stopwatch.StartNew();
for (int i = 0; i < Int32.MaxValue; i++) {
    bool condition = i < Int32.MaxValue / 2;
    sum += Convert.ToInt32(condition);
}


sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);

sum = 0;
sw = Stopwatch.StartNew();

for (int i = 0; i < Int32.MaxValue; i++) {
    bool condition = i < Int32.MaxValue / 2;
    if (condition) {
        sum++;
    }
}

sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);

【讨论】:

    【解决方案3】:

    有很多很多很多方法可以编写做同样事情的代码。但这一切都归结为可读性和可维护性。

    您可以选择以二进制形式编写它,您将能够以最有效的方式对其进行优化。但是您不会发现有太多人能够维护您编写的代码。我敢打赌,当出现错误时,您甚至不想阅读自己的二进制代码。

    那么你想用哪种方式来做呢?考虑到第二种方法没有太多的性能提升,我会说肯定会选择第一种,以便以后可能会阅读您的代码的人。

    【讨论】:

      【解决方案4】:

      我认为代码的清晰度取决于上下文。

      对于几乎所有的普通情况,

      if (condition) i++;
      

      ...会更容易阅读。

      但在某些情况下,替代方案可能更容易理解。想象一下,如果这个列表很长:

      var errorCount = 0
      errorCount += Convert.ToInt32(o.HasAProblem);
      errorCount += Convert.ToInt32(o.HasSomeOtherProblem);
      errorCount += Convert.ToInt32(p.DoesntWork);
      

      另一方面,对于上述情况,也许我会找到一种不同的方式来完全构建代码,例如

      var errorFlags = new [] {o.HasProblem, 
                               o.HasSomeOtherProblem, 
                               p.DoesntWork};
      var errorCount = errorFlags.Count(a => a);
      

      还有结构

      i += Convert.ToInt32(condition);
      

      ...可能会产生更清洁的pipeline,因为不涉及branch prediction。关键词是可能

      【讨论】:

      • Convert.ToInt32 只是调用涉及分支的return !value ? 0 : 1;
      猜你喜欢
      • 2013-11-18
      • 1970-01-01
      • 1970-01-01
      • 2010-12-09
      • 1970-01-01
      • 1970-01-01
      • 2019-04-04
      • 2021-12-21
      相关资源
      最近更新 更多