C# 区别于;如果(条件)int++&引用;和int+;=&引用;转换为32(条件)“;

C# 区别于;如果(条件)int++&引用;和int+;=&引用;转换为32(条件)“;,c#,if-statement,conditional-statements,C#,If Statement,Conditional Statements,这两种将值递增一的方法 if (Condition) int++; 及 那么,以这样或那样的方式书写是否有好处,或者它们基本上是一样的?将布尔值添加到整数中没有任何意义 是的,它能工作,因为转换。但这仍然没有任何意义。这是不合逻辑的 程序应该清晰明了,而不是要解决的难题。我从下面的基准测试中得到了7527ms和5888ms。第一种方法(布尔转换)除了从代码可读性的角度来看很糟糕之外,速度也较慢。这是有道理的,这种方法的开销总是1)执行从bool到int的转换,2)执行加法操作。是的,添加“0”

这两种将值递增一的方法

if (Condition) int++;


那么,以这样或那样的方式书写是否有好处,或者它们基本上是一样的?

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

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


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

我从下面的基准测试中得到了7527ms和5888ms。第一种方法(布尔转换)除了从代码可读性的角度来看很糟糕之外,速度也较慢。这是有道理的,这种方法的开销总是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);
int和=0;
var sw=Stopwatch.StartNew();
对于(inti=0;i
有很多方法可以编写完成相同任务的代码。但归根结底是可读性和可维护性

您可以选择用二进制编写,这样您就能够以最有效的方式对其进行优化。但是您不会发现有太多ppl能够维护您编写的代码。我敢打赌,当出现bug时,你甚至不想阅读自己的二进制代码


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

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

对于几乎所有的普通情况

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);

…可能会导致清洁,因为没有涉及。关键词是may。

一个比另一个更容易阅读。如果我在代码评审中看到第二个,我会让开发人员更改它。但那是我。一个正在形成一个分支,另一个是演员。@MikeMcCaughan我会让他们也改变第一个;
if
的语句与条件:)@BradleyDotNET的语句在同一行没有任何关系,它不是真正的演员阵容。
是否有价值?Boolean.True:Boolean.False
其中
True
为常数1,
False
为常数零。仍然存在分支。@BradleyDotNET别忘了JavaScript!:)哈哈,别开玩笑了,
Convert.ToInt32
只需调用
return!价值0 : 1;其中涉及分支。
i += Convert.ToInt32(condition);