为什么我不能创建对象实例?

时间:2018-11-03 08:59:42

标签: c# .net class oop

我需要将对象添加到列表中,但是我不明白如何正确执行操作。 我从控制台获得的每个新对象。 如何解决?

我的尝试:

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 :(得分:5)

首先,最好创建一个List的{​​{1}},而不是Cars的列表。所以改变这个:

Objects

对此:

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

如果您使用属性而不是字段,那就太好了。最后,作为问题的解决方案,并且根据您在最后一个List<Car> cars = new List<Car>(); 方法中需要显示的内容,可以覆盖ToString方法。您的课程应该是这样的:

Console.Writeline

如果您使用的是旧版本的C#:

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} ";
    }
}

return String.Format("Name = {0}, Speed = {1}", Name, Speed); 被称为字符串插值,可从C#6 +获得。我使用$提供了等效功能,而C#的较早版本中提供了该功能。

答案 1 :(得分:1)

在控制台中编写Car对象时,将在后台调用Car.ToString方法。

  

Object.ToString是.NET Framework中的主要格式化方法。   它将对象转换为其字符串表示形式,以便   适合展示。 Object.ToString的默认实现   方法返回对象类型的标准名称。

Object.ToString Method

如果要更改对象的默认字符串表示形式,则必须重写该方法。

   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}";

        }
    }

答案 2 :(得分:1)

Console.WriteLine,负责打印文本。

如果Console.WriteLine(string)实际上返回字符串值; 在任何其他情况下,它都会尝试通过调用实例对象 .ToString()方法将值转换为字符串。

C#中的任何类型都继承自System.Object,因此具有.ToString()方法。 通过使用继承,许多类型将覆盖实际的继承方法,并实现其对值作为字符串的外观的认识。

使用method overriding并应用您自己的逻辑,即可轻松完成此操作。

示例取自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()Source code

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

System.Int32通过将1的值更改为"1"来实现。
而其他类型可以自己实现。例如:new DateTime(2018, 12, 31) can return "12/31/2018"