2

我的问题是:我正在为 c# 编写一个涉及用户身份验证的控制台应用程序。我已经声明了一个用户类并将所有现有用户放在一个列表中。我有这个块来查看用户的输入是否与登录序列中的现有用户名匹配。

User CurrentUser;
for (int i = 0; i < users.Count; i++)
{
    if (UsernameLogonInput == users[i].Name)
    {
        nameExists = true;
        CurrentUser = users[i];
    }
}

这一切都很好,但后来,我有这个块,用于登录。

if (nameExists)
{
    bool isValid = false;
    do
    {
        Console.Write("Enter Password : ");
        string input = Console.ReadLine();
        if (input == CurrentUser.Password)
        {
            isValid = true;
        }
        else
        {
            Console.WriteLine("INVALID. EC102");
        }
    } while (!isValid);
}

我遇到的问题是,Visual StudioCurrentUser.Password在第二个块中说“使用未分配的局部变量”。我很确定这是因为 CurrentUser 是在 if 语句中分配的,我想知道是否有任何方法可以解决块范围的问题。

4

1 回答 1

3

您可以通过在声明变量时对其进行初始化来轻松解决该问题,即使它是 null 或空值。例如:

User CurrentUser = null;

但是当你必须这样做时,它可能表明有一些更好的方法来排序你的逻辑。例如,而不是所有这些:

User CurrentUser;
for (int i = 0; i < users.Count; i++)
{
    if (UsernameLogonInput == users[i].Name)
    {
        nameExists = true;
        CurrentUser = users[i];
    }
}

...你可以这样写:

//using System.Linq;
User CurrentUser = users.SingleOrDefault( u => u.Name == UsernameLogonInput );

这会将变量初始化为匹配的用户或 null 如果没有找到。

SingleOrDefault 是 System.Linq 命名空间的扩展方法。它接受一个表达式作为参数,并将搜索列表并找到任何匹配的单个记录,如果不匹配,则为 default/null。参数是一个 lambda 表达式。

于 2018-02-20T21:50:57.407 回答