33

请注意,问题不是关于否定布尔值,而是关于最优雅、最有效和最好的方法。

单击切换按钮后,我执行以下代码以将新状态存储在 privatebool中。

_isIt = !_isIt;

它确实有效。它是可读的,当然。但是i = i + 1,我们仍然总是写作i++。有没有更简洁的方法来切换 a bool

4

5 回答 5

27

事实上,还有另一个选项可以切换布尔值,这将起作用:

_isIt ^= true;

然而,这并不比你做的更好......

于 2012-10-05T17:34:03.577 回答
20

不,这是最佳方式。恭喜!

即使如果有其他方式(正如您评论的那样 - _isIt!!),我相信最好不要使用它,因为无论如何您都会引起很多关注。

于 2012-10-05T17:32:12.893 回答
4

速记

虽然答案已被接受,但我相信更深入的答案对于未来的读者来说会很好。正如这篇文章所指出的,!orNOT运算符是最广泛接受的,也是最佳解决方案。事实上,与^XOR超过 10,000 次迭代相比,它大约快 100 毫秒。老实说,用法都取决于具体情况。无论哪种方式,您都会在下面找到切换值的三种最常用方法bool,并且您应该在允许使用的标准范围内选择最适合使用的方法。


if-else方法_

切换bool值的最简单方法是写出一个if-else分配新值的值;这样,即使是完全的开发初学者也可以理解正在发生的事情。这实际上是在大多数概念课程中教授切换的方式。

bool b = true;
if (b == true)
    b = false;
else
    b = true;

当然,if可以简化为if (b),但传统上,为了清晰和学习目的,你会一直写出来。


NOT 运算符

随着您更多地了解开发和逻辑操作,您将了解NOT运算符或!C#. 由于多种原因,该运算符的使用在行业中被最广泛接受。简单、易读、易懂、速度快:

x = !x;

这分解为!true = false!false = true


XOR 运算符

XORor ^in是该C#任务选择较少的运算符,但根据具体情况,它是可接受的运算符。正如一些人在评论中指出的那样,此运算符在处理较长的名称或深度访问成员时特别有用。如果性能很重要,并且该操作将执行多次,则最好与NOT操作员一起使用,因为它更快。如果性能不是真正的问题,那么使用XOR操作符是可以接受的;尽管在专业环境中,您可能需要证明使用的合理性。

b ^= true;
b = b ^ true;

XOR在将其用于切换之前要了解的最重要的事情是了解它的逻辑工作原理:

true ^ false = true;
true ^ true = false;
false ^ true = true;
false ^ false = false;

该逻辑表解释了为什么b ^= false不会切换。AXOR要求运算符的一侧是,另一侧truefalse。它是哪一边无关紧要,但任何一边都不能是相同的值,否则它将评估为false. 因此:

bool b = true;
b ^= false; // true.
b ^= false; // true. So on, and so forth.

bool b = false;
b ^= false; // false.
b ^= false; // false. So on, and so forth.

最后的想法

OP问题的答案很简单:

  • 操作员是最NOT干净、最有效的切换解决方案。

祝你在未来的工作中一切顺利,希望这个答案有助于进一步阐明这个话题!

于 2018-10-15T20:40:07.703 回答
3

不,我相信这是切换 a 的惯用 C# 方式bool(即为其分配相反的值)。

我的意见:保持你的代码不变。它清楚地传达了代码的意图,这对未来的读者来说是最重要的。

如果您对替代方法感兴趣,可以使用 XOR,但我认为它的可读性较差。

_isIt ^= true;
于 2012-10-05T17:30:54.760 回答
0

不,没有。我不知道还有什么要添加到这个答案:)

于 2012-10-05T17:31:17.433 回答