为什么在使用 "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"))
这是逻辑的基本规律。
!(a && b) = !a || !b
有时候用通俗易懂的文字写更容易理解:
如果 username
不等于 administrator
或 username
不等于 administrator2
然后隐藏管理表单
假设 username
是 administrator
然后控件会隐藏,因为有一件事是真的(它不是administrator2
)
为什么?
问题_____________________________________value
如果username
不等于administrator
_________0
如果username
不等于administrator2
________1
好的,所以结果是 0 or 1
即 true
首先,我真的没有使用 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
我对此有点困惑。如果系统的当前用户名是 !=
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"))
这是逻辑的基本规律。
!(a && b) = !a || !b
有时候用通俗易懂的文字写更容易理解:
如果 username
不等于 administrator
或 username
不等于 administrator2
然后隐藏管理表单
假设 username
是 administrator
然后控件会隐藏,因为有一件事是真的(它不是administrator2
)
为什么?
问题_____________________________________value
如果username
不等于administrator
_________0
如果username
不等于administrator2
________1
好的,所以结果是 0 or 1
即 true
首先,我真的没有使用 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