为什么这个变量不能改变这个值?
Why is this variable not able to change this value?
在 class“CaseMethods”和方法“ChangeUsername”中,它应该更改用户的用户名。但是,在 else 声明中(非常低)我有声明:
uap.users[ipos] = newUserName;
这实际上更改了用户名,但是当我尝试使用新用户名“登录”时,它不起作用。相反,它仍然使用原来的用户名。
这是相关代码:
class UsernamesAndPasswords 包括“登录”的用户名和密码
方法Login就是登录
public class UsernamesAndPasswords
{
public string[] users = { "admin", "WinstonMillward", "EdwenaSweet", "LiviaDennell", "EugeneAddison", "MarshaAdams", "", "", "", "", "", "", "", "", "" };
public string[] pswrds = { "password", "WM13051977", "ES17061985", "LD24091994", "EA12101996", "MA03031999", "", "", "", "", "", "", "", "", "" };
}
public class CaseMethods
{
public void ChangeUsername(int ipos)
{
var uap = new UsernamesAndPasswords();
Console.WriteLine("Enter your current username: ");
if (Console.ReadLine() == uap.users[ipos])
{
EnterUsername();
void EnterUsername()
{
Console.WriteLine("Enter your new username: ");
string newUserName = Console.ReadLine();
ConfirmUsername(newUserName);
}
void ConfirmUsername(string newUserName)
{
Console.WriteLine("Confirm your new username: ");
if (newUserName != Console.ReadLine())
{
UsernamesDontMatch();
void UsernamesDontMatch()
{
Console.WriteLine("Those usernames do not match. To change your new password type \"new\". To try to confirm your username again type \"try again\"");
switch (Console.ReadLine())
{
case "new":
EnterUsername();
break;
case "try again":
ConfirmUsername(newUserName);
break;
default:
Console.WriteLine("That is not one of the options.");
UsernamesDontMatch();
break;
}
}
}
else
{
uap.users[ipos] = newUserName;
Console.WriteLine($"Username has been changed to {newUserName}.\nPlease login using your new username.");
var cl = new CompanyLogin();
cl.Login();
}
}
}
else
{
Console.WriteLine("That is not your current username.");
ChangeUsername(ipos);
}
}
}
public void Login()
{
var uap = new UsernamesAndPasswords();
string indexPosIn = Console.ReadLine();
int ipos = Convert.ToInt32(indexPosIn);
string iuser = Console.ReadLine();
string ipswrd = Console.ReadLine();
switch ((iuser, ipswrd))
{
case (var plA, var plB) when iuser == uap.users[0] && ipswrd == uap.pswrds[0]:
Admin();
break;
case (var plA, var plB) when iuser == uap.users[ipos] && ipswrd == uap.pswrds[ipos] && iuser != "admin":
User(iuser, ipos);
break;
default:
Console.WriteLine("Incorrect. Try Again.");
Login();
break;
}
}
我试过查看代码,看看是否有任何东西可以阻止该部分更改 UsernamesAndPasswords class 中的值。我没有找到任何可能的东西。我会在网上搜索,但我真的不知道我可以搜索什么来解决这个问题。
您正在 ChangeUsername
和 Login
方法中创建 UsernamesAndPasswords
class 的新实例。这些实例不相关,因此当变量 uap
在方法结束时超出范围时,您在 ChangeUsername
中所做的更改将丢失。你可以有这样的东西:
public class CaseMethods
{
private UsernamesAndPasswords uap = new UsernamesAndPasswords();
public void ChangeUsername(int ipos)
{
...
this.uap[...]; // use the shared member
...
}
public void Login()
{
...
this.uap[...]; // use the shared member
...
}
}
正如 HasaniH 所指出的,您正在创建两个单独的 UAP 实例(用户名和密码)。
为了防止这种情况发生,我强烈建议将 UsernameAndPasswords
class 重构为具有两个名为 username
和 [=12= 的字段的 class ] 使用适当的 setter 和 getter 以及起始函数所在的位置,使用您在这些数组中已有的数据创建您的用户帐户数组,因此您实际上是在创建一个 UsernameAndPasswords
对象数组(我可能会重命名 class 到 accounts
也是一个更通用的名称)。
这样你就有了一个位于中心的 UsernameAndPasswords
对象数组,然后可以将这些对象传递给你拥有的相应辅助函数。
特别是关于辅助函数,我建议单独定义每个函数,而不是在彼此内部定义,这将使您的代码阅读和调试更容易。这是因为它允许函数快速重用,而不是将范围锁定到它定义的函数。
在 class“CaseMethods”和方法“ChangeUsername”中,它应该更改用户的用户名。但是,在 else 声明中(非常低)我有声明:
uap.users[ipos] = newUserName;
这实际上更改了用户名,但是当我尝试使用新用户名“登录”时,它不起作用。相反,它仍然使用原来的用户名。
这是相关代码:
class UsernamesAndPasswords 包括“登录”的用户名和密码
方法Login就是登录
public class UsernamesAndPasswords
{
public string[] users = { "admin", "WinstonMillward", "EdwenaSweet", "LiviaDennell", "EugeneAddison", "MarshaAdams", "", "", "", "", "", "", "", "", "" };
public string[] pswrds = { "password", "WM13051977", "ES17061985", "LD24091994", "EA12101996", "MA03031999", "", "", "", "", "", "", "", "", "" };
}
public class CaseMethods
{
public void ChangeUsername(int ipos)
{
var uap = new UsernamesAndPasswords();
Console.WriteLine("Enter your current username: ");
if (Console.ReadLine() == uap.users[ipos])
{
EnterUsername();
void EnterUsername()
{
Console.WriteLine("Enter your new username: ");
string newUserName = Console.ReadLine();
ConfirmUsername(newUserName);
}
void ConfirmUsername(string newUserName)
{
Console.WriteLine("Confirm your new username: ");
if (newUserName != Console.ReadLine())
{
UsernamesDontMatch();
void UsernamesDontMatch()
{
Console.WriteLine("Those usernames do not match. To change your new password type \"new\". To try to confirm your username again type \"try again\"");
switch (Console.ReadLine())
{
case "new":
EnterUsername();
break;
case "try again":
ConfirmUsername(newUserName);
break;
default:
Console.WriteLine("That is not one of the options.");
UsernamesDontMatch();
break;
}
}
}
else
{
uap.users[ipos] = newUserName;
Console.WriteLine($"Username has been changed to {newUserName}.\nPlease login using your new username.");
var cl = new CompanyLogin();
cl.Login();
}
}
}
else
{
Console.WriteLine("That is not your current username.");
ChangeUsername(ipos);
}
}
}
public void Login()
{
var uap = new UsernamesAndPasswords();
string indexPosIn = Console.ReadLine();
int ipos = Convert.ToInt32(indexPosIn);
string iuser = Console.ReadLine();
string ipswrd = Console.ReadLine();
switch ((iuser, ipswrd))
{
case (var plA, var plB) when iuser == uap.users[0] && ipswrd == uap.pswrds[0]:
Admin();
break;
case (var plA, var plB) when iuser == uap.users[ipos] && ipswrd == uap.pswrds[ipos] && iuser != "admin":
User(iuser, ipos);
break;
default:
Console.WriteLine("Incorrect. Try Again.");
Login();
break;
}
}
我试过查看代码,看看是否有任何东西可以阻止该部分更改 UsernamesAndPasswords class 中的值。我没有找到任何可能的东西。我会在网上搜索,但我真的不知道我可以搜索什么来解决这个问题。
您正在 ChangeUsername
和 Login
方法中创建 UsernamesAndPasswords
class 的新实例。这些实例不相关,因此当变量 uap
在方法结束时超出范围时,您在 ChangeUsername
中所做的更改将丢失。你可以有这样的东西:
public class CaseMethods
{
private UsernamesAndPasswords uap = new UsernamesAndPasswords();
public void ChangeUsername(int ipos)
{
...
this.uap[...]; // use the shared member
...
}
public void Login()
{
...
this.uap[...]; // use the shared member
...
}
}
正如 HasaniH 所指出的,您正在创建两个单独的 UAP 实例(用户名和密码)。
为了防止这种情况发生,我强烈建议将 UsernameAndPasswords
class 重构为具有两个名为 username
和 [=12= 的字段的 class ] 使用适当的 setter 和 getter 以及起始函数所在的位置,使用您在这些数组中已有的数据创建您的用户帐户数组,因此您实际上是在创建一个 UsernameAndPasswords
对象数组(我可能会重命名 class 到 accounts
也是一个更通用的名称)。
这样你就有了一个位于中心的 UsernameAndPasswords
对象数组,然后可以将这些对象传递给你拥有的相应辅助函数。
特别是关于辅助函数,我建议单独定义每个函数,而不是在彼此内部定义,这将使您的代码阅读和调试更容易。这是因为它允许函数快速重用,而不是将范围锁定到它定义的函数。