C#简单的IF OR问题

5

抱歉要问这个问题,我本以为我知道答案,如果userName大于4个字符或者userName不是一个叫做student的账户,我想退出程序。但是即使userName只有3个字符并且不是student,我仍然会遇到Application.Exit。我做错了什么?

if (userName.Length > 4 | userName != "student")
{
    Application.Exit();
}

我真是太丢人了 :-(


这个声明是没有意义的,因为只有当用户名为student时,你的应用程序才会退出。 - Andrey
另外,使用 userName.Equals("student")。 - Jason Maskell
如果这反映了某些业务规则或约定,你应该将逻辑提取到一个具有有意义的名称的单独函数中。 - Instance Hunter
@Mark:我不明白Equals方法为什么不是类型安全的? - James
@Mark:啊,抱歉误读了你的评论。 - James
显示剩余3条评论
5个回答

15

虽然你应该使用||而不是|,但在这种情况下它们会产生相同的结果。尽管其他答案获得了赞同,但将|更改为|| 不会解决你的问题。

你真正的问题是你希望检查的条件总是为真。要么你的用户名不是student,要么它是student并且长度超过4个字符。

当你有一个只有3个字符的用户名时,它不等于“student”,因此程序退出。

从你对期望结果的描述中,我认为你的意思是:

if (userName.Length > 4 && userName != "student")
{
    Application.Exit();
}

6

您需要使用布尔 OR (||) 运算符,而不是位 OR (|)。

就像我在评论中所说的那样,您的逻辑对我来说并没有任何意义。按照目前的方式,该语句将始终为 true:

  • 如果 userName 不是 student,则该语句为 true,应用程序退出。

  • 如果 userName 是 student,则长度大于 4,并再次为 true(导致退出)。

您可以更改如下内容:

if(username.Length > 4 && userName != "student")
{
    Application.Exit();
}

从逻辑上讲,这更有意义,但由于我不知道您的意图,不能保证它能按照您想要的方式工作。


如果 (userName.Length > 4 || userName != "student"),这段代码有意义吗? - Andrey
也许最好使用Form.Close而不是Application.Exit(如果可能的话)。 - Andrew Florko
@Andrey 你说得对,这个语句的逻辑并不清晰...但是我看不到他/她代码的其余部分,也就无法知道正确的逻辑应该是什么。我只能看到他显然在使用错误的运算符进行比较。 - Justin Niessner

0
 if (userName.Length > 4 || userName.ToLower() != "student")
 {
     Application.Exit();
 }

试试这个。


ToLower() 的影响可能取决于 UI 如何接受输入。此外,用户名可能区分大小写... - James
在我看来,仍然更安全。有时候你会想为什么条件没有被满足,其实只是一个简单的情况问题。 - Ta01
@Random:仅当大小写不重要时。 - James
1
不要使用ToLower()进行不区分大小写的字符串比较--它无法通过Turkey测试。相反,请使用带有不区分大小写StringComparison参数的String.Equals!http://www.moserware.com/2008/02/does-your-code-pass-turkey-test.html http://msdn.microsoft.com/en-us/library/t4411bks.aspx - dtb
好的观点,但仍然想知道为什么有人两次投票反对这个答案,至少给我一个理由。 - Ta01

0
从您的需求来看,您对字符长度的检查是微不足道的,或者至少您没有提到为什么要检查字符长度。根据您提供的示例,我会简单地检查if (userName != "student"),我认为没有必要进行额外的检查,这是可以在用户界面中强制执行的内容。

0

如果我没错的话,您正在尝试在任一条件为真时进入if循环。即,进入if循环

  1. 当长度大于。
  2. 当用户名不应等于“学生”时

像用户名=“ABC”这样的条件不是“学生”,您的条件仍然正确并将进入。当userName等于=“student”时,它仍将执行;

在这里,您应该使用AND运算符而不是OR运算符。

if (userName.Length > 4 & userName != "student")
  {
   Application.Exit();                
  }

您也可以使用 && 运算符来实现相同的结果。& 运算符与 && 运算符相同。 当 X = false 且 Y = true 时,Y 将不会被评估。因为 X 已经是 false。这种方法也称为短路评估。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接