我正在尝试在Student类中创建一个属性Age。我已经在下面编写了代码,但是当我运行它时,值0立即分配给age变量。
我想允许用户从控制台输入信息,但是我还需要处理Age属性内的可能错误。
我在Student类中有以下代码:
private int age;
public int Age
{
get
{
return age;
}
set
{
string age1 = Console.ReadLine();
try
{
int.Parse(age1);
}
catch (ArgumentNullException)
{
Console.WriteLine("Age was not entered.");
}
catch (ArgumentOutOfRangeException)
{
if (value < 0 || value > 100)
{
Console.WriteLine("Please enter a valid age!");
}
/*else
{
age = value;
}*/
}
age = value;
}
}
public void PrintInformation()
{
Console.WriteLine($"Age: {Age} ");
}
这在Main方法中:
Console.Write("Please enter age: ");
Console.WriteLine(student.Age);
student.PrintInformation();
我需要此输出-> Age :(从用户输入的年龄)。我该如何解决?
答案 0 :(得分:1)
在setter方法中读取用户输入是一个糟糕的主意。您应该阅读设置器值之外的输入,并在打印之前。设置器最多应包含实际上设置属性值或计算内容的逻辑,但应以最简单的方式编写。
话虽这么说,您的代码出了什么问题?实际上您只是在Console.WriteLine(student.Age);
中打印学生的年龄,甚至没有调用Age
属性的setter方法。 ,这反过来根本不会调用Console.ReadLine()
来读取用户的输入。
对于Age
属性,您应该遵循以下几行内容:
public int Age { get; set; }
对于输入/输出操作(可能在程序的Main()方法内部):
string age1 = Console.ReadLine();
try
{
student.Age = int.Parse(age1);
if (student.Age < 0 || student.Age > 100)
Console.WriteLine("Please enter a valid age!");
else
Console.WriteLine($"Age: {student.Age} ");
}
catch (FormatException)
{
Console.WriteLine("Invalid number entered.");
}
答案 1 :(得分:0)
想在属性获取器/设置器中与控制台进行交互是非常不寻常的。
请勿使用Parse
进行用户输入,如果可以将字符串解析为整数,请使用TryParse
返回true或false
将数字的字符串表示形式转换为其32位带符号 等价的整数。返回值指示操作是否 成功。
对于此应用程序,您可以(并整齐地)在控制台应用程序的更高级别上的while循环中进行验证。
Console.WriteLine("Enter age between 0 and 100");
int age = 0;
while(!int.TryParse(Console.ReadLine(), out age) || age < 0 || age > 100)
Console.WriteLine("You had one job, enter a correct age between 0 and 100 (inclusively)");
student.Age = age;
作为第二道防线,您可以做类似的事情(有争议)
public int Age
{
get => _age;
set
{
if (value < 0 )
throw new InvalidOperationException("Negative aged people are absurd");
_age = value;
}
}
注意:有很多方法可以做到这一点,但是要注意的是:使用适当的解析方法;并使您的吸气剂和装夹器尽可能轻便。是的,尽管与它们中的控制台进行交互非常可疑,但是您可以根据需要进行验证并抛出它们