C# OOP入门求助:如何将对象存入数组及输出异常问题
嘿,很高兴看到你开始C# OOP的练习!我来帮你梳理下问题所在,以及怎么调整代码达到你想要的效果~
为什么输出不是你期望的?
你看到的OOP_Car_Human.Car是C#中对象默认的ToString()方法输出——所有类都继承自object,而object.ToString()的默认行为就是返回类的完全限定名(命名空间+类名)。另外,用object[]存储Car对象其实没必要,也没发挥C#强类型语言的优势。
下面是具体的修正方案:
1. 重写Car类的ToString()方法
在Car类里添加这个方法,让它返回你想要的车型信息:
public override string ToString() { return Model; // 也可以扩展成更详细的信息,比如return $"{Model} (最高时速: {Speed})"; }
2. 使用强类型数组(Car[]而非object[])
C#是强类型语言,既然数组里存的全是Car对象,直接用Car[]会更安全、更简洁,还能避免不必要的类型转换。你甚至可以直接用数组初始化器一次性创建数组,不用逐个赋值:
// 强类型数组+初始化器,一步到位 Car[] cars = new Car[] { porsche, mercedes, bmw, punto, ferrari }; // 或者更简洁的写法,编译器会自动推断类型 var cars = new[] { porsche, mercedes, bmw, punto, ferrari };
修正后的完整代码
static void Main(string[] args) { // Create 5 Car Objects and add them to Array var porsche = new Car("Porshe", 340); var mercedes = new Car("Mercedes", 320); var bmw = new Car("BMW", 330); var punto = new Car("Punto", 220); var ferrari = new Car("Ferrari", 380); // 用强类型数组+初始化器,更简洁 var cars = new[] { porsche, mercedes, bmw, punto, ferrari }; foreach(var car in cars) { Console.WriteLine($"some {car}"); } } class Car { public Car(string model, int speed) { Model = model; Speed = speed; } public string Model { get; set; } public int Speed { get; set; } public int CalculateSpeed( int speed, int skill) { return speed * skill; } // 重写ToString方法,自定义输出内容 public override string ToString() { return Model; } }
运行后的输出
现在控制台会输出你期望的内容:
some Porshe some Mercedes some BMW some Punto some Ferrari
另外补充一点:如果你之后需要访问数组中Car对象的其他属性(比如Speed),用Car[]的话可以直接访问,不用做类型转换,这也是强类型数组的优势哦~
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

