该代码为年龄变量分配默认值0

时间:2018-12-27 00:00:49

标签: c# properties output

我正在尝试在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 :(从用户输入的年龄)。我该如何解决?

2 个答案:

答案 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)

  1. 想在属性获取器/设置器中与控制台进行交互是非常不寻常的。

    • 这也属于Separation of Concerns类别。也就是说,与标准输入进行交互是否真的是学生生活中的工作。如果将其从控制台应用程序更改为Web应用程序或WPF应用程序,该怎么办呢。您将不得不重新输入所有这些逻辑
  2. 请勿使用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;
   }
}

注意:有很多方法可以做到这一点,但是要注意的是:使用适当的解析方法;并使您的吸气剂和装夹器尽可能轻便。是的,尽管与它们中的控制台进行交互非常可疑,但是您可以根据需要进行验证并抛出它们