Почему я не могу создать экземпляр объекта? - PullRequest
0 голосов
/ 03 ноября 2018

Мне нужно добавить объекты в список, но я не могу понять, как это сделать правильно. Каждый новый объект я получаю с консоли. Как это исправить?

Моя попытка:

namespace ExampleCars
{
    public class Car
    {
        public string name;
        public int speed;
        public Car(string name, int speed)
        {
            this.name = name;
            this.speed = speed;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            string name;
            int speed, elements;
            List<Object> cars = new List<Object>();

            elements = Convert.ToInt32(Console.ReadLine());
            if (elements > 0)
            {                
                for (int i = 0; i < n; i++)
                {                    
                    name = Convert.ToString(Console.ReadLine());                    
                    speed = Convert.ToInt32(Console.ReadLine());                    
                    Car newCar = new Car(name, speed);
                    cars.Add(newCar);
                }
            }

            foreach (var oneCar in cars)
                Console.WriteLine(oneCar);
        }
    }
}

В консоли я получаю это (elements == 1):

ExampleCars.Car

Ответы [ 3 ]

0 голосов
/ 03 ноября 2018

когда вы пишете свой объект Car в консоли, вызов метода Car.ToString в фоновом режиме.

Object.ToString является основным методом форматирования в .NET Framework. Он преобразует объект в его строковое представление, чтобы он подходит для отображения. Стандартные реализации Object.ToString Метод возвращает полное имя типа объекта.

Метод Object.ToString

Если вы хотите изменить строковое представление вашего объекта по умолчанию, вы должны переопределить метод.

   public class Car
    {
        public string name;
        public int speed;
        public Car(string name, int speed)
        {
            this.name = name;
            this.speed = speed;
        }

        public override string ToString()
        {
            return $"{name} {speed}";

        }
    }
0 голосов
/ 03 ноября 2018

Console.WriteLine, отвечает за печать текста.

В случае Console.WriteLine(string) фактически возвращает строковое значение; В любом другом случае он пытается преобразовать значение в строку с помощью , вызывая метод экземпляра объекта .ToString().

Любой тип в C # наследуется от System.Object, и поэтому он имеет метод .ToString () . Используя Inheritance, многие типы переопределяют фактический унаследованный метод и реализуют свое восприятие того, как их значение должно выглядеть как строка.

Это легко сделать, используя метод , переопределяющий , и примените свою собственную логику.

Пример взят из MSDN

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

    public override string ToString()
    {
        return "Person: " + Name + " " + Age;
    }
}

Тестовый код

Person person = new Person { Name = "John", Age = 12 };
Console.WriteLine(person);
// Output:
// Person: John 12

Итак, вы можете спросить, почему я получаю ExampleCars.Car? вы получаете это, потому что вы не реализовали свое собственное представление метода объекта .ToString. Таким образом, реализация System.Object на самом деле возвращает тип экземпляра в виде строки, и это именно то, что вы получаете.

System.Object.ToString () Исходный код .

public virtual String ToString()
{
    return GetType().ToString();
}

System.Int32 внедрить, изменив значение 1 на "1"
В то время как другие типы могут реализовать свои собственные. например: new DateTime(2018, 12, 31) can return "12/31/2018"

0 голосов
/ 03 ноября 2018

Прежде всего, было бы лучше создать List из Cars вместо списка Objects. Так что измени это:

List<Object> cars = new List<Object>();

К этому:

List<Car> cars = new List<Car>();

Также было бы здорово, если бы вы использовали свойства вместо полей. И, наконец, в качестве решения вашего вопроса, и исходя из того, что вам нужно показать в вашем последнем методе Console.Writeline, вы можете переопределить метод ToString. Ваш класс должен быть примерно таким:

public class Car
{
    public string Name { get; set; }
    public int Speed { get; set; }
    public Car(string name, int speed)
    {
        Name = name;
        Speed = speed;
    }

    public override string ToString()
    {
        return $"Name = {Name}, Speed = {Speed} ";
    }
}

А если вы используете более старые версии C #:

return String.Format("Name = {0}, Speed = {1}", Name, Speed);

$ называется String Interpolation и доступен из C # 6 +. Я предоставил его эквивалент, используя String.Format, который доступен в более старых версиях C #.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...