为什么会使用未分配的局部变量

本文关键字:分配 局部变量 为什么 | 更新日期: 2023-09-27 18:00:28

这里有很多类似的问题,但我不明白为什么我不能在C#中使用它们,而不能在其他语言中使用。如果我没有使用try-catch块,但希望我在使用它时初始化变量,那么这段代码是如何工作的。在这种情况下,内存分配是如何进行的。附言:我是一个初学者,其中一些东西对我来说意义有限

using System;
public class Example
{
   public static void Main()
    {
    int user=0, pass=0;
    do
    {
        Console.WriteLine("Enter the username");
        try
        {
            user = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("Enter the password");
            pass = Convert.ToInt32(Console.ReadLine());
            if (user == 12 && pass == 1234)
                Console.WriteLine("Correct");
            else
                Console.WriteLine("Invalid Username or Password");
            Console.ReadKey();
        }
        catch (FormatException)
        {
            Console.WriteLine("Invalid Format");
        }
        catch (OverflowException)
        {
            Console.WriteLine("Overflow");
        }
    }
    while (user != 12 && pass != 1234);
}

    }

为什么会使用未分配的局部变量

在C#中,访问变量之前需要对其进行初始化。在您的示例中,如果没有try/catch块,变量userpass将使用初始化

    user = Convert.ToInt32(Console.ReadLine());

    pass = Convert.ToInt32(Console.ReadLine());

在您使用访问它们的线路之前

    while (user != 12 && pass != 1234);

但是,如果您使用try/catch块,如您的示例所示,并且在中抛出FormatExceptionOverflowException

    Convert.ToInt32(Console.ReadLine());

一旦你在中访问变量,它们就会被取消初始化

    while (user != 12 && pass != 1234);

因为如果在try/catch之前不初始化变量。你必须在每个区块中指定它们

        int user, pass;
        do
        {
            Console.WriteLine("Enter the username");
            try
            {
                user = Convert.ToInt32(Console.ReadLine());// it will not be initialized if process fails.
                pass = Convert.ToInt32(Console.ReadLine());// it will not be initialized if process fails.
            }
            catch (FormatException)
            {
                // what is user and pass?
                Console.WriteLine("Invalid Format");
            }
            catch (OverflowException)
            {
                // what is user and pass?
                Console.WriteLine("Overflow");
            }
        } while (user != 12 && pass != 1234);

因为每个区块都有失败的可能性。所以你必须在每个块中初始化它们。如果你在尝试catch之前不这样做。

如果你不使用try-catch:

        int user, pass;
        do
        {
            Console.WriteLine("Enter the username");
            user = Convert.ToInt32(Console.ReadLine()); // it will be initialized any way.
            pass = Convert.ToInt32(Console.ReadLine()); // it will be initialized any way.

        } while (user != 12 && pass != 1234);

Convert.ToInt32(Console.ReadLine());,那么用户或通行证的值是多少?