4

我有一个用户将遍历的问题列表,他们可以从任何问题开始,但他们确实有顺序,所以为了做到这一点,我只需维护数组的索引并像这样递增它:

CurrentQuestion = (++CurrentQuestion < questions.Length) ? CurrentQuestion : 0;

这里发生的事情不一定很明显,有没有更优雅的方法来做到这一点?

4

3 回答 3

12

我强烈反对++在一个变量上使用,然后在同一个语句中再次使用该变量。我相信这条线在 C# 中可以正常工作,但是像这样的线在 C/C++ 中是未定义的,因此它们为我提出了一个标志。我会选择

CurrentQuestion = (CurrentQuestion+1) % questions.Length;

我认为这是在类 C 语言中进行时钟算术的惯用方式。

于 2012-06-15T20:07:25.103 回答
3

这里发生的事情不一定很明显,有没有更优雅的方法来做到这一点?

虽然这对某些人来说并不是很明显,但我确切地知道这是在做什么。

但是,您可能要考虑的是,编写可读代码比聪明更重要。代码必须维护,而且你并不比编译器聪明。

像这样编写代码,并对此感到满意:

//ensure that the CurrentQuestion counter increments and loops back around after hitting "list max"
CurrentQuestion = CurrentQuestion + 1;
if (CurrentQuestion >= questions.Length) {
  CurrentQuestion = 0;
} // meta-comment: use braces incase you have to add more later

重要的是这段代码现在是可读的,并且仍然是优化的。它与其他代码完全一样,我们可以稍后更改部分而不需要重新阅读代码。

还要注意我在这里使用的一些语义。

  • 始终使用牙套,即使您认为不需要它们。
  • CurrentQuestion = CurrentQuestion + 1;而不是CurrentQuestion += 1;or CurrentQuestion++;or ,++CurrentQuestion;因为第一个在意图上更加明确。始终编​​写有目的的代码。
于 2012-06-15T20:03:35.947 回答
0

不需要条件运算符

 CurrentQuestion = ++CurrentQuestion % questions.Length;

但我想你更喜欢哪一个更重要的是风格问题

于 2012-06-15T20:08:51.373 回答