我在下面发布了我的代码。
当我使用时,我的问题是程序崩溃:
myCarLabel.Text = MyCar.ToString();
我做错了什么?
我想将MyCar.Brand
和MyCar.Year
的值输出到myCarLabel。
它可以使用:myCarLabel.Text = comboBoxBrand.Text +“\ n”+ comboBoxYear.Text;
但是后来我使用我的课等等而失去了全部意义..任何建议?
class Vehicle
{
public string Brand { get; set; }
public string Year { get; set; }
// GetVehicleInfo() ska returnera värdena från MyCar
public string GetVehicleInfo()
{
return Brand + "\n" + Year;
}
}
class Car : Vehicle
{
public string Kolor { get; set; }
}
private Car MyCar;
private void Form1_Load(object sender, EventArgs e)
{
MyCar = new Car();
MyCar.Brand = comboBoxBrand.Text;
MyCar.Year = comboBoxYear.Text;
}
private void button1_Click(object sender, EventArgs e)
{
// comboBoxBrand.Text + "\n" + comboBoxYear.Text;
myCarLabel.Text = MyCar.ToString();
myCarLabel.BackColor = colorDialog.Color;
}
答案 0 :(得分:2)
我不明白你的“程序崩溃”是什么意思,但看着你的代码,你应该这样做:
myCarLabel.Text = MyCar.GetVehicleInfo();
您没有覆盖ToString方法。默认的ToString实现将返回有关命名空间的一些元数据。
答案 1 :(得分:1)
崩溃可以归结为1000件事。在您的具体示例中,可能与事实相关
myCarLabel.Text = MyCar.ToString();
或MyCar
为空
或myCarLabel
为空
或两者
另外,我没有在您的班级中看到ToString(..)
方法的覆盖,例如:
class Car : Vehicle
{
public string Kolor { get; set; }
public override string ToString() {
return Kolor;
}
}
这些只是基本的例子,你可能需要什么,很难从你的问题中扣除一些具体内容。
答案 2 :(得分:0)
public class Vehicle
{
public Vehicle()
{
// do instantiations here so that none of your members are null
}
public override string ToString()
{
return Brand + "\n" + Year;
}
}
public class Car : Vehicle
{
public Car() : base()
{
// Note that the base default constructor is called with : base()
// then perform Car-specific instantiations here.
}
...
public override string ToString()
{
// Now, you can refer to the super class's ToString() if you want to.
return base.ToString() + "\n" + Kolor;
}
}
答案 3 :(得分:0)
您也可以在Vehicle
类覆盖ToString()
上使用继承(如示例所示)当您进行此操作时,Car
类将使用函数ToString()
在Vehicle
类上,因为实际上Car
类在ToString()
类上使用函数Object
。最后你不需要使用表达式MyCar.Tostring()
,只需使用函数MyCar
(myCarLabel.Text = MyCar)中第4行的button1_Click
class Vehicle
{
public string Brand { get; set; }
public string Year { get; set; }
// GetVehicleInfo() ska returnera värdena från MyCar
public string GetVehicleInfo()
{
return Brand + "\n" + Year;
}
public override string ToString() {
return GetVehicleInfo();
}
}
class Car : Vehicle
{
public string Kolor { get; set; }
}
private Car MyCar;
private void Form1_Load(object sender, EventArgs e)
{
MyCar = new Car();
MyCar.Brand = comboBoxBrand.Text;
MyCar.Year = comboBoxYear.Text;
}
private void button1_Click(object sender, EventArgs e)
{
// comboBoxBrand.Text + "\n" + comboBoxYear.Text;
myCarLabel.Text = MyCar;
myCarLabel.BackColor = colorDialog.Color;
}
答案 4 :(得分:0)
为了找到崩溃的原因,这里有几个检查:
确保Form.Load
事件已正确设置为您的方法并被调用。您可以在Form1_Load
内的第一行或括号上设置断点( F9 ),以确保它被击中。
在行myCarLabel.Text = MyCar.ToString()
上设置断点。将鼠标悬停在myCarLabel
和MyCar
上以确保它们在调试器中不为空。
至于代码的改进,这里有一些:
首先,您尚未在ToString()
或Car
类上覆盖Vehicle
。虽然这不是必需的,但您的ToString()
方法会在此返回一个相当无意义的YourNamespace.Car
字符串。考虑添加覆盖:
public override string ToString()
{
// Format this however you'd like:
return string.Format("{0} {1}", this.Year, this.Brand);
}
其次,您要在Car
事件中创建Form.Load
实例,这意味着对ComboBox
的更改不会反映在您的对象中。因此,如果用户更改了所选的品牌或年,则不会更新该对象。考虑将其移至Button.Click
事件:
void myButton_Click(object sender, EventArgs e)
{
var car = new Car();
car.Year = yearComboBox.Text;
car.Brand = brandComboBox.Text;
myCarLabel.Text = car.ToString();
myCarLabel.BackColor = colorDialog.Color;
}
此外,您不需要将Car
存储为成员变量。如果您需要自定义对话框或Form
来添加/编辑汽车条目,最好创建返回Car
或在自定义Form
上具有类似属性的方法。例如:
void addCarButton_Click(object sender, EventArgs e)
{
var dialog = new AddCarForm();
var result = dialog.ShowDialog();
if(result != DialogResult.OK) return;
var newCar = dialog.Car;
// Do something with the newly created car.
}
但是,如果必须保留成员变量,则应以小写字母myCar
而不是MyCar
开头,以避免与属性,常量和方法混淆。
答案 5 :(得分:-1)
您必须覆盖类的toString()方法
public override string ToString()
{
return comboBoxBrand.Text +"\r\n"+comboBoxYear.Text;
}
答案 6 :(得分:-1)
我没有看到MyCar被初始化,也没有看到任何异常处理。因此,您的程序必然会崩溃