这里有许多类似的问题,但我无法理解为什么我不能在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);
}
}
答案 0 :(得分:4)
在C#中,需要在访问变量之前初始化变量。在您的示例中,如果您没有尝试/捕获阻止,变量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);
答案 1 :(得分:0)
因为如果你在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());
那么用户或传递的价值是什么?