我确定它可以忽略不计,但鉴于我想将true
分配给方法中的布尔字段,这个选择是否会有所不同?如果是这样,为什么?
field = true; // could already be true, but I don't care
与
if(!field) field = true;
答案 0 :(得分:16)
我会说不。但这确实取决于我们真的在谈论字段而不是属性这一事实,可能(尽管它绝对不应该)在你所包含的两个片段中表现出不同的行为(即,如果在吸气剂中存在具有副作用的逻辑)。
更新:如果您谈论的是性能开销,几乎没有差异 - 但是我认为分配的成本要低得多(比阅读值)。这是一个示例程序来演示:
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);
我机器上的输出:
Assignment: 2749.6285 ms Read: 4543.0343 ms
答案 1 :(得分:10)
对于某个字段,只需设置即可。对于属性,它可能更复杂,具体取决于get
或set
是否过于昂贵,和/或set
是否在内部检查(绕过事件等)。
作为属性的一般规则,只需设置它,直到您知道这是一个问题,因为分析。
对于田地;不要过分担心它;默认只是设置。
答案 2 :(得分:5)
早在90年代,当我在x86汇编程序中编程时,规则是(IIRC)以避免跳转。 if
语句可以作为跳转实现。
因此,我的结论是(至少某些那些古老的规则仍然适用),避免if
并直接分配会更有效。
答案 3 :(得分:0)
我通常做的是,如果我期待其他东西,那么任何类型的变量的默认值我都将它设置为通常不会的东西。这样,如果值没有改变,那么我知道会发生什么以及如何处理它。它不适用于你的例子,你的问题有点模糊,你的例子没有解释你试图做什么。
我当然同意Marc和Dan的陈述。