初学者:输出与预期不同

本文关键字:输出 初学者 | 更新日期: 2023-09-27 18:18:04

我试图从私有类获得预先确定的输出(指定为颜色和速度)。然而,当我要求程序写出这一行时,它打印出的是Car_EX_3.Car,而不是颜色和数字。

这是我到目前为止的代码

namespace Car_Ex_3
{
    class Car
    {
        private string colour;
        private double speed;
        public Car(string colour)
        {
            this.colour = colour;
        }
        public Car(string colour, double speed)
        {
            this.colour = colour;
            this.speed = speed;
        }
        public string GetColour()
        {
            return colour;
        }
        public double GetSpeed()
        {
            return speed;
        }
        class Program
        {
            static void Main(string[] args)
            {
                Car car1 = new Car("red" + " " + 50d);
                Car car2 = new Car("Yellow" +" " + 60d);
                Console.WriteLine(car1);
                Console.WriteLine(car2);
                Console.ReadKey();
            }
        }
    }
}

初学者:输出与预期不同

正如许多人已经提到的那样:重写Object.ToString()方法会给您想要的结果。

c#中的每个类都派生自System.Object类,但.ToString()方法通常只打印实例的类名。为了防止这种情况,在Car类中实现一个新方法:

public override string ToString ()
{
     return "Car (Color: " + colour + ", Speed: " + speed.ToString() + ")";
}

或与String.Format:

public override string ToString ()
{
    return string.Format("Car (Color: {0}, Speed: {1})", colour, speed.ToString());
}

看一下代码:

// Don't forget to include the access modifier
class Car
{
private string colour;
private double speed;
// Is it valid to have just a color and not a speed as well?
public Car(string colour)
{
    this.colour = colour;
}
public Car(string colour, double speed)
{
    this.colour = colour;
    this.speed = speed;
}
// In C# this should be a property
public string GetColour()
{
    return colour;
}
public double GetSpeed()
{
    return speed;
}
class Program
{
    static void Main(string[] args)
    {
        Car car1 = new Car("red" + " " + 50d);
        Car car2 = new Car("Yellow" +" " + 60d);
        This is incorrect
        Console.WriteLine(car1);
        Console.WriteLine(car2);
        Console.ReadKey();
    }
}
}

试试下面的命令:

public class Car
{
private string colour;
private double speed;
// Is it valid to have just a color and not a speed as well?
public Car(string colour)
{
    this.colour = colour;
    // Initialize it to 0.0
    speed = 0.0;
}
public Car(string colour, double speed)
{
    this.colour = colour;
    this.speed = speed;
}
// In C# this should be a property
public string Colour
{
    get { return colour; }
}
public double Speed
{
    get { return speed; }
}
class Program
{
    static void Main(string[] args)
    {
        Car car1 = new Car("red" + " " + 50d);
        Car car2 = new Car("Yellow" +" " + 60d);
        // Do something like the following to print what you want
        Console.WriteLine(car1.Colour + " " + car1.Speed);
        Console.WriteLine(car2.Colour + " " + car2.Speed);
        Console.ReadKey();
    }
}
}
正如其他人提到的,您也可以通过重写ToString()方法来实现这一点。如果你想走这条路,Ian H.在他的回答中有一个很好的代码示例。

你做错了。

正确的方法:

Car car1 = new Car("red", 50d);
Car car2 = new Car("Yellow", 60d);
Console.WriteLine("Car1 Color: " + car1.colour + " Number: " + car1.speed);
Console.WriteLine("Car2 Color: " + car2.colour + " Number: " + car2.speed);

你必须使用有两个参数的构造函数,一个参数是颜色,第二个参数是速度。在Console.WrtieLine()中,您直接编写类对象,这就是为什么它会给出不想要的结果(Car_EX_3.Car),因为它通过名称空间和类名告诉您对象的类型。您必须访问car1car2对象的colourspeed属性。

一开始你做的是Car car1 = new Car("red" + " " + 50d);,它调用的是单参数构造函数,而不是双参数构造函数,因为"red" + " " + 50d会被编译器转换成字符串。

正如Ian H.上面所建议的,您可以重写ToString()或制作自己的方法来将复合类型(您的类对象)转换为所需的字符串格式,并在代码中随时使用