初学者:输出与预期不同
本文关键字:输出 初学者 | 更新日期: 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
),因为它通过名称空间和类名告诉您对象的类型。您必须访问car1
和car2
对象的colour
和speed
属性。
一开始你做的是Car car1 = new Car("red" + " " + 50d);
,它调用的是单参数构造函数,而不是双参数构造函数,因为"red" + " " + 50d
会被编译器转换成字符串。
正如Ian H.上面所建议的,您可以重写ToString()
或制作自己的方法来将复合类型(您的类对象)转换为所需的字符串格式,并在代码中随时使用