为什么这个变量不能改变这个值?

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 中的值。我没有找到任何可能的东西。我会在网上搜索,但我真的不知道我可以搜索什么来解决这个问题。

您正在 ChangeUsernameLogin 方法中创建 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 对象数组,然后可以将这些对象传递给你拥有的相应辅助函数。

特别是关于辅助函数,我建议单独定义每个函数,而不是在彼此内部定义,这将使您的代码阅读和调试更容易。这是因为它允许函数快速重用,而不是将范围锁定到它定义的函数。