Этот код присваивает переменной возраста значение по умолчанию 0 - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь создать свойство Age внутри класса Student.Я написал код ниже, но когда я его запускаю, значение 0 сразу присваивается переменной возраста.

Я хочу разрешить пользователю вводить информацию с консоли, но мне также нужно обрабатывать возможные ошибки внутри свойства 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();

Мне нужно иметь такой вывод-> Возраст: (возраст введен пользователем).Как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018
  1. Очень необычно хотеть взаимодействовать с консолью в методе получения / установки свойств.

    • Это также подпадает под категорию Разделение проблем .Т.е. это действительно работа студентов в жизни, чтобы взаимодействовать со стандартным вводом.Что, если вы измените это с консольного приложения на веб-приложение или приложение 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;
   }
}

Примечание : Есть много способов сделать это,Тем не менее, взять домой очки;Использование правильных методов разбора;и держать ваши геттеры и сеттеры как можно более легкими.Да, вы можете проверять их и выдавать в зависимости от ваших потребностей, хотя взаимодействие с консолью внутри них весьма подозрительно

0 голосов
/ 27 декабря 2018

Чтение ввода пользователя внутри метода установки - ужасная идея.Вы должны прочитать ввод за пределами значения установщика и , прежде чем печатать его .Установщик должен содержать не более логики, которая фактически устанавливает значение вашего свойства или вычисляет что-то, но это должно быть написано максимально простым способом.

При этом в вашем коде неправильно то, чтона самом деле вы просто печатаете возраст учащегося в Console.WriteLine(student.Age);, который даже не вызывает метод установки вашего свойства Age, который, в свою очередь, вообще не вызывает 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.");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...