如何使用for循环

时间:2017-01-19 15:36:10

标签: c# loops

我在循环之外声明变量setPassword,然后在循环内给它一个值。然后在下一个do-while循环中,我尝试使用分配的值,但它表示"使用未分配的局部变量"。
profile[I]是在循环之前创建的对象数组。是否在循环中分配的值未保存,或者profile[I].Password的值是否为null,因为尚未创建对象?

bool good = false;
string username;
do
{
    bool broke = false;

    Console.WriteLine("Please create a username");
    username = Console.ReadLine();
    for (int i = 0; i < profile.Count; i++)
    {
        if (username == profile[i].Username)
        {
            Console.WriteLine("The username already exists");
            broke = true;
            break;
        }

    }
    if (broke == false)
    {
        good = true;
    }


} while (good == false);
Console.WriteLine("Please create a password");
string password = Console.ReadLine();
profile.Add(new Users(username, password, 0));

string setPassword;
bool validUser = false;
do
{
    Console.Clear();
    Console.WriteLine("Enter your username");
    string tryUsername = Console.ReadLine();

    for (int i = 0; i < profile.Count; i++)
    {
        if (profile[i].Username == tryUsername)
        {
            setPassword = profile[i].Password;
            validUser = true;
        }
    }
    if (validUser == false)
    {
        Console.WriteLine("Invalid username. Usernames are case sensitive");
        Thread.Sleep(2500);
    }
} while (validUser == false);

bool validPass = false;
do
{
    Console.WriteLine("Enter your password");
    string tryPass = Console.ReadLine();
    if (tryPass == setPassword) //this is the error
    {
        validPass = true;
    }
    else
    {
        Console.WriteLine("Invalid password. Passwords are case sensitive");
    }
} while (validPass == false);

5 个答案:

答案 0 :(得分:1)

编译器无法知道它实际上会被分配(如果不是所有if语句都没有被评估为true)。

分配一个默认值,你会没事的:

string setPassword = null;

答案 1 :(得分:1)

这是因为编译器不能知道你的for - 循环至少执行一次,特别是循环中的if - 语句也至少经过一次迭代环。因此 - 至少从编译器的角度来看 - setPassword可能永远不会赋值,因此您会得到该错误。

在开始时分配null

string setPassword = null;

答案 2 :(得分:1)

  

我在循环之外启动变量setPassword,然后在循环内给它一个值。

这就是问题所在。在使用之前,系统不能保证分配值。

循环可能会迭代0次 周围if语句的条件也可能评估为false 这两种情况都导致setPassword永远无法获得价值。

因此,编译器会给您一个错误,您可能在它有值之前使用setPassword

解决方法是将其设置为循环外的默认值,并在if之外。

答案 3 :(得分:0)

基本上问题是: 您在if语句中使用它们,if语句使用变量。但是你只是声明但从未定义过全局/本地变量,它会自动给出一个错误,尽管变量将在本地获取用户的输入,但遗憾的是if语句过于愚蠢而无法为你检测,加上它也是采用用户跳过提供输入的步骤的可能性。因此,您需要设置默认值。 就像他们所说的那样,你可以使用: string setPassword = null;string setPassword = "";

[不需要考虑无效,默认情况下字符串可以是null]

答案 4 :(得分:0)

要解决您的问题,您应根据用例将setPassword分配给string.Emptynull或其他值

如果你对此感到好奇 - 为什么编译器会抱怨变量未分配,即使你在while循环中为它赋值?

这称为C#语言的 Definite Assignment 行为。如果

,则认为变量是明确赋值的
  1. 变量在声明时初始化 - 使用默认值或显式值
  2. 否则,如果编译器可以通过静态流分析(简单来说,编译时检查)证明,导致第一次使用变量的所有可能的执行路径都会为变量。注意,静态流分析是这里的关键,编译器不评估或理所当然地认为任何运行时可能性(if,while,for etc. control语句中的条件)最终将为变量赋值。
  3. 有关详细信息,请参阅Definite assignment at MSDN。它是一个存档文档,但仍然应该是一个很好的参考。 DotNetPerls Page也用简单的语言描述了它。

    免责声明:我与DotNetPerls无关。