C# 初学者:输出与预期不同

C# 初学者:输出与预期不同,c#,class,C#,Class,我试图从一个私有类获得一个预先确定的输出(指定为颜色和速度)。但是,当我要求程序编写行时,它打印出的是Car\u EX\u 3.Car,而不是颜色和数字 这是到目前为止我的代码 namespace Car_Ex_3 { class Car { private string colour; private double speed; public Car(string colour) { thi

我试图从一个私有类获得一个预先确定的输出(指定为颜色和速度)。但是,当我要求程序编写行时,它打印出的是
Car\u EX\u 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()
方法通常只打印实例类的名称。要防止出现这种情况,请在
汽车
类中实施一种新方法:

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());
}

事实上,你做得不对

正确的方法:

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);
您必须使用具有2个参数的构造函数,一个参数颜色,第二个参数是速度。 在
Console.WrtieLine()
中,您直接编写了类对象,这就是为什么它会产生不想要的结果(
Car\u EX\u 3.Car
),因为它通过名称空间和类名告诉您对象的类型。 您必须访问
car1
car2
对象的
color
speed
属性

最初,您正在做
car1=新车(“红色”+“”+50d),它调用的是单参数构造函数,而不是双参数构造函数,因为编译器将
的“red”+“”+50d
转换为字符串


正如上面Ian H.所建议的,您可以重写
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.在他的答案中有一个很好的代码示例,如果这是您想要走的路线。

您没有编写任何可以打印颜色或数字的代码。了解
ToString()
.Console.WriteLine(car1.getcolor());是不是应该是新车(黄色,60d)@Steve谢谢!就这样!我还有一个错误,用“+”而不是“,”在主stringWrite中,您可以将类分开编写,而不是将程序类包装在car类中作为开始。为了更简洁,您可能需要让代码示例使用字符串返回字符串。Format函数与所有值+字符串文字的串联我不确定这是否太高级。编辑我的答案:)