为什么在使用 "not equals" 时 or 运算符在 if 语句中不起作用?

Why doesn't or operator work in if statement when using "not equals"?

我对此有点困惑。如果系统的当前用户名是 != Administrator 或 Administrator2,我想隐藏一个按钮,但实现我想要的目标的唯一方法是使用 && 而不是 ||

 string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;

        if
            (userName != @"PC\Administrator" && userName != @"PC\Administrator2")
        {              
            button2.Hide();
        }

但是,在我的表单中的另一个位置打开 button2,如果我使用 ==,它似乎可以工作?

  string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
  var adminform = new AdminForm();

      if  (userName == @"PC\Administrator" || userName == @"PC\Administrator2")
        {
            adminform.Show();
        }

知道为什么在第一个示例中使用 != 时我不能使用 || 吗?

将整个 not 表达式括在括号中并将其取反。像这样:

if  (!(userName == @"PC\Administrator" || userName == @"PC\Administrator2"))
{
   button2.Hide();
}

De Morgan's Laws for Boolean operations是程序员需要深入了解的重要技能。

在你的例子中,当取反时你需要额外的括号来正确地排序操作,或者在你的例子中将 || 更改为 &&。要使用 ||,您需要输入

if (!(userName == @"PC\Administrator" || userName == @"PC\Administrator2"))

这是逻辑的基本规律。

De morgan's law

!(a && b) = !a || !b

有时候用通俗易懂的文字写更容易理解:

如果 username 不等于 administrator username 不等于 administrator2 然后隐藏管理表单

假设 usernameadministrator

然后控件会隐藏,因为有一件事是真的(它不是administrator2

为什么?

问题_____________________________________value


如果username不等于administrator_________0

如果username不等于administrator2________1


好的,所以结果是 0 or 1true

首先,我真的没有使用 c# 的经验,但如果我正确理解了你的问题,那是你使用的逻辑,而不是仅 c# 的东西。

您希望当用户不是两个管理员之一时调用方法 "hide",但您尝试的逻辑是获取两个布尔值: user_is_not_admin1 user_in_not_admin2

当您使用 && 时,您检查用户不是 admin1 也不是 admin 2,这是按预期工作的。 但是当用 || 替换它时您将检查用户是否永远不会同时是 admin1 和 admin2(如果发生这种情况似乎很奇怪)。 相反,当尝试使用 ||你还需要移动 nagation。你想要的是检查用户“不是(admin1 或 admin2)。

如需进一步阅读,请查看德摩根定律。 http://en.wikipedia.org/wiki/De_Morgan%27s_laws