【问题标题】:Why I can't create object instance?为什么我不能创建对象实例?
【发布时间】:2019-04-07 08:43:12
【问题描述】:

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

我的尝试:

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

【问题讨论】:

    标签: c# .net class oop


    【解决方案1】:

    首先,最好创建ListList,而不是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);
    

    $ 称为字符串插值,可从 C#6+ 获得。我已经使用 String.Format 提供了它的等价物,它在旧版本的 C# 中可用。

    【讨论】:

    • 在此代码中返回 $"Name = {Name}, Speed = {Speed} "; VS不理解符号$并写,需要“;”
    • @Jack 好的。它称为字符串插值,可从 C#6+ 获得。检查我更新的答案,我提供了一个等效的答案,在旧版本的 C# 中可用。
    【解决方案2】:

    当您在控制台中编写 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}";
    
            }
        }
    

    【讨论】:

    • 在此代码中返回 $"{name} {speed}"; VS不理解符号$并写,需要“;”
    • 我不明白你的意思。我已经测试过了,它正在工作
    【解决方案3】:

    Console.WriteLine,负责打印文本。

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

    C# 中的任何类型都继承自 System.Object,因此它具有 .ToString() 方法。 通过使用 Inheritance,许多类型会覆盖实际继承的方法,并实现对它们的值应该是什么样的字符串的感知。

    这可以通过使用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"

    【讨论】:

      猜你喜欢
      • 2011-07-05
      • 2012-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      相关资源
      最近更新 更多