为什么会使用未分配的局部变量
本文关键字:分配 局部变量 为什么 | 更新日期: 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块,变量user
和pass
将使用初始化
user = Convert.ToInt32(Console.ReadLine());
和
pass = 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);
因为每个区块都有失败的可能性。所以你必须在每个块中初始化它们。如果你在尝试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());
,那么用户或通行证的值是多少?