繁体   English   中英

如何使用for循环内分配的值

[英]How to use value assigned within a for loop

我在循环外声明变量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);

编译器不知道它实际上会被赋值( if您将if语句评估为true那么也不是全部)。

分配一个默认值,您就可以了:

string setPassword = null;

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

开始时分配null

string setPassword = null;

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

这就是问题。 系统无法保证在使用值之前已为其分配了值。

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

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

解决方案是在循环之外和if之外将其设置为默认值。

基本上问题是这样的:您主要在if语句中使用它们,而if语句使用变量。 但是您只声明了但从未全局/局部定义变量,尽管变量将在本地接受用户的输入,但会自动给出错误,但是不幸的是, if语句太愚蠢而无法为您检测到该变量,此外还存在以下可能性:用户也跳过提供输入的步骤。 因此,您需要设置一个默认值。 就像他们所说的一样,您可以使用: string setPassword = null; string setPassword = "";

[无需介意nullable,默认情况下字符串可以为null ]

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

如果您好奇- 为什么即使在while循环中为变量分配了值,编译器仍会抱怨该变量未分配?

这称为C#语言的“ 确定分配”行为。 如果满足以下条件,则认为变量已明确分配

  1. 变量在声明时初始化-使用默认值或显式值
  2. 否则,如果编译器可以通过静态流分析 (简单来说就是编译时间检查)证明导致首次使用变量的所有可能的执行路径将为该变量分配一个值。 注意,静态流分析是这里的关键,编译器不会评估或认为任何运行时可能性(条件,if,while,for等控制语句中的条件)最终都会为变量分配一个值。

有关更多信息,请参见MSDN上的“确定分配” 这是一个存档文件,但仍应是一个很好的参考。 DotNetPerls页面也以简单的语言对其进行了描述。

免责声明:我与DotNetPerls没有关联。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM