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



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

 string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
        if
            (userName != @"PCAdministrator" && userName != @"PCAdministrator2")
        {              
            button2.Hide();
        }

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

  string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
  var adminform = new AdminForm();
      if  (userName == @"PCAdministrator" || userName == @"PCAdministrator2")
        {
            adminform.Show();
        }

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

De Morgan的布尔运算定律是程序员深入理解的一项重要技能。

在您的情况下,当进行否定时,您需要额外的括号来正确排列运算顺序,或者将||更改为&&。要使用||,您需要放置

if (!(userName == @"PCAdministrator" || userName == @"PCAdministrator2"))

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

if  (!(userName == @"PCAdministrator" || userName == @"PCAdministrator2"))
{
   button2.Hide();
}

这是逻辑的基本定律。

德摩根定律

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

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

如果username不等于administratorusername不等于administrator2,则隐藏管理表单

假设usernameadministrator

然后控件将隐藏,因为其中一件事是真的(不是administrator2

为什么?

问题_____________________________________值


如果username不等于administrator _________ 0

如果username不等于administrator2 ________ 1


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

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

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

当您使用&您检查用户是否不是admin1,也不是admin2,这可以正常工作。但是,当用||替换它时,您会检查用户是否从不同时是admin1和admin2(如果发生这种情况,这似乎很奇怪)。相反,当尝试使用||时,您还需要移动nagation。你想要的是检查用户"不是(admin1或admin2)。

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

最新更新