A或B,不是两者,都不是

Caf*_*eek 9 language-agnostic if-statement coding-style xor

自从阅读清洁代码以来,我一直在努力保持代码的描述性和易于理解.我有一个条件,必须填写A或B.但不是两者.而不是.目前if,检查这种情况的声明很难一目了然.您将如何编写以下内容,以便一目了然地查看正在检查的内容

if ((!string.IsNullOrEmpty(input.A) && !string.IsNullOrEmpty(input.B)) 
    || string.IsNullOrEmpty(input.A) && string.IsNullOrEmpty(input.B))
{
    throw new ArgumentException("Exactly one A *OR* B is required.");
}
Run Code Online (Sandbox Code Playgroud)

Jus*_*ner 24

异或的时间:

if(!(string.IsNullOrEmpty(input.A) != string.IsNullOrEmpty(input.B)))
    throw new ArgumentException("Exactly one A *OR* B is required.");
Run Code Online (Sandbox Code Playgroud)

你也可以看到它写成:

if(!(string.IsNullOrEmpty(input.A) ^ string.IsNullOrEmpty(input.B)))
    throw new ArgumentException("Exactly one A *OR* B is required.");
Run Code Online (Sandbox Code Playgroud)

  • 布尔表达式的XOR也可以写成`!=`.由于`^`很少用在布尔表达式中(至少在我看过的Java代码中),我实际建议使用`!=`,因为每个开发人员都知道这意味着什么. (11认同)
  • @Joachim; 只有当你只有一个真值时才这样,在C中你没有真值(任何非零都是真的). (3认同)

Nor*_*ame 13

if (string.IsNullOrEmpty(input.A) != string.IsNullOrEmpty(input.B)) {
 // do stuff
}
Run Code Online (Sandbox Code Playgroud)

  • 如果真值总是相同的话,这只是正确的,而在C中则不是必须的.1!= 2是真的,但应逻辑异或为假. (2认同)

Hen*_*rik 12

它是一个异或,它很容易模仿.

想想看:

两者都不可能是真的,两者都不能是假的.一个必须是真的,一个必须是假的.

所以,我们来看看:

if(string.IsNullOrEmpty(input.A) == string.IsNullOrEmpty(input.B)) {
   throw new ArgumentException("Exactly one A *OR* B is required.");
}
Run Code Online (Sandbox Code Playgroud)

如果两者相等,则它们都是真的,或者都是假的.这两种情况都是无效的.

而没有任何特殊XOR运算符的所有选择语言可能没有.;)


Don*_*ner 6

这种关系称为exclusive-or(xor).

有些语言将其作为运算符提供 - 通常是^:

True ^ True -> False
True ^ False -> True
False ^ True -> True
False ^ False -> False
Run Code Online (Sandbox Code Playgroud)