【发布时间】:2013-06-18 20:49:29
【问题描述】:
所以,如果我有这样的表达:
if (obj != null && i++ % divisor == 0)
{
....
}
而obj 是null,那么i 永远不会增加。如果我使用
i++;
if (obj != null && i % divisor == 0)
{
....
}
当然,i 是递增的。
这是设计使然吗?我从优化的角度理解短路评估,但我(错误地)假设编译器会识别后增量表达式并无论如何都对其进行评估。
(如果这在规范中,我找不到它 - 只是在这里寻找一些(喘气)意见。)
更新
这是实际代码。
private int _frameNumber = 0;
private void simulator_OnFrameEnd(object sender, System.EventArgs e)
{
_frameNumber++;
if (_visualizer != null && _frameNumber % _config.VisualizerUpdateFrequency == 0)
{
var field = _simulator.GetField(_config.PreviewField);
_visualizer.Update(field, _simulator.FrameTime);
}
if (_frameNumber % _config.OptimizerRegridFrequency == 0)
{
_simulator.UpdateFieldGrids();
}
}
【问题讨论】:
-
如果你想要这种行为,你可以使用
&。 -
如果你非要问这个问题,那就说明你的代码不可读。
-
简单。其他人在阅读您的代码时也会有同样的问题。我建议你构建你的代码,这样就不会出现这个问题。
-
当然行为是正确的。您误以为短路行为是一种优化。不是这样的。这是一个重要的保证。如果它是可选优化,那么您不能保证
if (obj != null && obj.ToString().Length > 10)不会崩溃! -
@JohnSaunders 的建议是好建议;这段代码很难阅读,风格也很糟糕。如果您不了解 C# 中运算符的含义,那么 (1) 教育自己,以及 (2) 编写更容易让不了解其含义的人阅读和维护的代码。一个好的经验法则是每个表达式都应该有完全零副作用——表达式应该对它们的值有用,而不是它们的效果—— - 并且每一个单独的语句都应该只引起一个副作用。具有多重副作用的陈述很难推理。
标签: c# compilation