性能:总是指定布尔值还是先检查值?

我确定它可以忽略不计,但考虑到我想在方法中为一个布尔字段赋值true ,这个选择有什么不同吗? 如果是这样,为什么?

 field = true; // could already be true, but I don't care 

 if(!field) field = true; 

我会说不。 但这确实取决于我们真正在讨论的是一个字段而不是一个属性 ,这可能 (尽管它绝对不应该)在你所包含的两个片段中表现出不同的行为(即,如果存在具有副作用的逻辑,吸气剂)。

更新 :如果你在谈论性能开销,几乎没有区别 – 我相信任务的成本会比阅读价值稍微低一些。 这是一个示例程序来演示:

 bool b = false; Stopwatch sw = Stopwatch.StartNew(); for (int i = 0; i < int.MaxValue; ++i) { b = true; } sw.Stop(); TimeSpan setNoCheckTime = sw.Elapsed; sw = Stopwatch.StartNew(); for (int i = 0; i < int.MaxValue; ++i) { // This part will never assign, as b will always be true. if (!b) { b = true; } } sw.Stop(); TimeSpan checkSetTime = sw.Elapsed; Console.WriteLine("Assignment: {0} ms", setNoCheckTime.TotalMilliseconds); Console.WriteLine("Read: {0} ms", checkSetTime.TotalMilliseconds); 

我机器上的输出:

作业:2749.6285 ms
阅读:4543.0343毫秒

对于一个字段,只需设置它。 对于属性,它可能更复杂,取决于getset是否不成比例地昂贵,和/或set是否在内部检查(绕过事件等)。

作为属性的一般规则,只需设置它,直到您知道这是一个问题,因为分析。

对于田地; 不要过分担心它; 默认只是设置。

早在90年代,当我在x86汇编程序中编程时,规则是(IIRC)以避免跳转。 if语句可以作为跳转实现。

所以我的结论是(根据这一假设,至少有一些古老的规则仍然适用),避免if和直接分配会更有效。

我通常做的是,如果我期待其他东西,那么任何类型的变量的默认值我将它设置为通常不会的东西。 这样,如果值没有改变,那么我知道会发生什么以及如何处理它。 它不适用于你的例子,你的问题有点模糊,你的例子没有解释你试图做什么。

我当然同意Marc和Dan的陈述。