我有一个用户将遍历的问题列表,他们可以从任何问题开始,但他们确实有顺序,所以为了做到这一点,我只需维护数组的索引并像这样递增它:
CurrentQuestion = (++CurrentQuestion < questions.Length) ? CurrentQuestion : 0;
这里发生的事情不一定很明显,有没有更优雅的方法来做到这一点?
我有一个用户将遍历的问题列表,他们可以从任何问题开始,但他们确实有顺序,所以为了做到这一点,我只需维护数组的索引并像这样递增它:
CurrentQuestion = (++CurrentQuestion < questions.Length) ? CurrentQuestion : 0;
这里发生的事情不一定很明显,有没有更优雅的方法来做到这一点?
我强烈反对++
在一个变量上使用,然后在同一个语句中再次使用该变量。我相信这条线在 C# 中可以正常工作,但是像这样的线在 C/C++ 中是未定义的,因此它们为我提出了一个标志。我会选择
CurrentQuestion = (CurrentQuestion+1) % questions.Length;
我认为这是在类 C 语言中进行时钟算术的惯用方式。
这里发生的事情不一定很明显,有没有更优雅的方法来做到这一点?
虽然这对某些人来说并不是很明显,但我确切地知道这是在做什么。
但是,您可能要考虑的是,编写可读代码比聪明更重要。代码必须维护,而且你并不比编译器聪明。
像这样编写代码,并对此感到满意:
//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;
因为第一个在意图上更加明确。始终编写有目的的代码。不需要条件运算符
CurrentQuestion = ++CurrentQuestion % questions.Length;
但我想你更喜欢哪一个更重要的是风格问题