为什么此代码即使不应该显示错误也会显示错误?



我对编程有点陌生,无法让这些看起来简单的代码工作我想做的是制作一个可以在阵列上工作的登录系统,这样更容易编辑并将新人员添加到列表中。

string[] UserCodes = { "admin", "testcode" }; //these are the arrays
string[] UserWords = { "123", "testword" };

public void Button_Clicked(object sender, EventArgs e)
{
for (int i = 0; i < UserCodes.Length; i++)
if (UserCode.Text.Equals(UserCodes[i])  && UserWord.Text.Equals(UserWords[i]))
{
Navigation.PushAsync(new HomePage());
}
for (int i = 0; i < UserCodes.Length; i++)    
if (UserCode.Text != (UserCodes[i]) || UserWord.Text !=(UserWords[i]))
{
DisplayAlert("Something Went Wrong", "Incorrect Password or Username", "Try Again");
}   
}                   // And this is the "main" code

我认为主要问题出现在第二部分,它显示了一个错误,因为如果我没有正确输入密码,它会正常工作,但如果我输入正确,它会在显示错误的同时将我发送到主页。我试过使用else if,也试过使用(!command.Equals(Array[i]))。我非常困惑为什么它会这样做。

在调试器中逐步执行此代码。如果您键入正确的UserCode和UserWord,您将调用Navigation.PushAsync(new HomePage())。。。然后继续前进。

接下来,您将检查是否有任何UserWord或UserCode是而不是您键入的内容,然后显示错误消息。

您可能希望在Navigation.PushAsync(new HomePage())之后调用return,或者跳过第二个for语句。

当你有一个循环来检查一个条件,然后是一个完全不同的循环来检查该条件何时失败时,我觉得这就像是一种代码气味。正如@Corvus所指出的,你应该在匹配后返回,然后在所有循环完成后推迟错误消息:

public void Button_Clicked(object sender, EventArgs e)
{
for (int i = 0; i < UserCodes.Length; i++)
{
if (UserCode.Text.Equals(UserCodes[i]) &&  UserWord.Text.Equals(UserWords[i]))
{
Navigation.PushAsync(new HomePage());
return; // thanks to @Corvus
}
}
DisplayAlert("Something Went Wrong", "Incorrect Password or  Username", "Try Again");
}

也就是说,有些改进是你可以做的,但你没有问过。通常,无论大小写,用户名都是可以接受的,但密码必须始终与大小写匹配。您可以处理密码,但用户名匹配可以更改为忽略大小写。

另外,您有两个必须彼此同步的数组。我建议使用Dictionary<字符串,字符串>其中用户名是密钥,密码是值。

相关内容

  • 没有找到相关文章