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

C# 为什么会使用未分配的局部变量?,c#,C#,这里有许多类似的问题,但我不明白为什么不能在C语言中使用它们,而在其他语言中使用它们。如果我没有使用try-catch块,但希望我在使用它时初始化变量,那么这段代码是如何工作的。在这种情况下,内存分配是如何进行的。 另外,我是个初学者,有些东西对我来说意义有限 using System; public class Example { public static void Main() { int user=0, pass=0; do { C

这里有许多类似的问题,但我不明白为什么不能在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块,变量
user
pass
将用

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

在您访问它们的位置之前

    while (user != 12 && pass != 1234);
但是,如果您使用try/catch块(如示例中所示),并抛出
FormatException
OverflowException

    Convert.ToInt32(Console.ReadLine());
然后,在中访问变量后,变量将被取消初始化

    while (user != 12 && pass != 1234);
在C#中,需要在访问变量之前初始化变量。在您的示例中,如果没有try/catch块,变量
user
pass
将用

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

在您访问它们的位置之前

    while (user != 12 && pass != 1234);
但是,如果您使用try/catch块(如示例中所示),并抛出
FormatException
OverflowException

    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);
因为每个模块都有失败的可能性。因此,如果在尝试捕获之前不进行初始化,则必须在每个块中初始化它们

如果您不使用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())
那么user或pass的值是多少?

因为如果在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);
因为每个模块都有失败的可能性。因此,如果在尝试捕获之前不进行初始化,则必须在每个块中初始化它们

如果您不使用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())
那么user或pass的值是多少?

在方法
int user=0,pass=0的第一行初始化变量@Habib:问题是他为什么要初始化它们。所以问题是为什么他需要那条线,而他没有试球就不需要。这个答案似乎非常准确。@Chris,你说得对,否决票被删除了。谢谢。有道理!!变量在方法
int user=0,pass=0的第一行初始化@Habib:问题是他为什么要初始化它们。所以问题是为什么他需要那条线,而他没有试球就不需要。这个答案似乎非常准确。@Chris,你说得对,否决票被删除了。谢谢。有道理!!如果代码已经在一个封闭块中初始化,那么就不需要在每个代码路径中进行初始化。我知道。我正在向用户说明这一点。他问如果我使用try-catch,为什么需要初始化它?如果不使用try-catch,则不需要在封闭块中初始化@我不明白我错了吗@Sehnsuchtnothing是“错误的”,但您应该更清楚地说明,在访问使用的任何代码路径之前,都需要为任何变量指定一个值。这与尝试/捕捉没有多大关系;如果do/while循环从初始化变量的if块开始,则会出现相同的问题,因为在我们不输入的代码路径中,如果我们到达变量无法初始化的点,则会出现相同的问题。是的,一般的答案是,每个变量必须在将其值用于任何目的之前进行初始化。if/else条件也会发生同样的情况。。开关箱等@sehnsucht如果代码已经在一个封闭块中初始化了,那么就没有必要在每个代码路径中进行初始化。我知道。我正在向用户说明这一点。他问如果我使用try-catch,为什么需要初始化它?如果不使用try-catch,则不需要在封闭块中初始化@我不明白我错了吗@Sehnsuchtnothing是“错误的”,但您应该更清楚地说明,在访问使用的任何代码路径之前,都需要为任何变量指定一个值。这与尝试/捕捉没有多大关系;如果do/while循环从初始化变量的if块开始,则会出现相同的问题,因为在我们不输入的代码路径中,如果我们到达变量无法初始化的点,则会出现相同的问题。是的,一般的答案是,每个变量必须在将其值用于任何目的之前进行初始化。if/else条件也会发生同样的情况。。开关箱等@Sehnsuchton值得注意的是,“为什么我不能在c语言中使用它们,但在其他语言中[我可以]”,答案是“因为c语言是另一种语言”。这种行为是c#设计理念的一部分。他们本可以在没有明确初始化的情况下轻松实现,但他们没有。回答为什么不在堆栈溢出的范围内,除了说他们认为这是一个比另一个更好的主意之外。问题解释了一些。值得注意的是,“为什么我不能在c语言中使用它们,但在其他语言中[我可以]”,答案是“因为c语言是另一种语言”。这种行为是c#设计理念的一部分。他们本可以在没有明确初始化的情况下轻松实现,但他们没有。回答为什么不在堆栈溢出的范围内,除了说他们认为这是一个比另一个更好的主意之外。这个问题解释了一些问题。