-1

我在下面发布了我的代码。

我的问题是我使用时程序崩溃:

myCarLabel.Text = MyCar.ToString();

我做错了什么 ?

我想将值从 myCarLabel 输出MyCar.BrandMyCar.YearmyCarLabel 。

它使用: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;
}
4

7 回答 7

2

我不明白您所说的“程序崩溃”是什么意思,但是看着您的代码,您似乎应该这样做:

myCarLabel.Text = MyCar.GetVehicleInfo();

您没有覆盖 ToString 方法。默认的 ToString 实现将返回一些关于命名空间的元数据。

于 2013-01-16T15:42:32.890 回答
1

崩溃可以发生在 1000 件事情上。在你的具体例子中,它可能与一个事实有关

myCarLabel.Text = MyCar.ToString();
  • MyCar为空

  • myCarLabel为空

  • 或两者兼有

另外,我没有看到ToString(..)您的类中的方法被覆盖,例如:

class Car : Vehicle
{
    public string Kolor { get; set; }

    public override string ToString() {
          return Kolor;
    }
}

这些只是您可能需要的基本示例,很难从您的问题中推断出具体的内容。

于 2013-01-16T15:42:30.177 回答
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;
     }
}
于 2013-01-16T15:49:11.650 回答
0

你也可以使用继承,在Vehicle类覆盖ToString()上(如示例),当你这样做时,Car类将使用类ToString()上的函数Vehicle,因为实际上,Car类使用类ToString()上的函数Object。最后,您无需使用表达式MyCar.Tostring(),只需MyCar在函数button1_Click(myCarLabel.Text = MyCar)中的第 4 行使用

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;
}
于 2013-01-16T16:14:35.440 回答
0

为了找到崩溃的原因,这里有几个检查:

  • 确保Form.Load事件已正确设置为您的方法并被调用。您可以在第一行或内部括号中设置断点 ( F9Form1_Load )以确保它被命中。

  • 在行上设置断点myCarLabel.Text = MyCar.ToString()。将鼠标悬停在两者上myCarLabelMyCar确保它们在调试器中不为空。

至于对您的代码的改进,这里有一些:

首先,您没有覆盖ToString()任何一个CarVehicle类。虽然这不是必需的,但您的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不会反映在您的对象中。因此,如果用户更改选择的BrandYear,它不会更新对象。考虑将其移至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;
}

此外,您不需要为此存储 aCar作为成员变量。如果您需要自定义对话框或Form添加/编辑汽车条目,最好创建Car在 custom 上返回 a 或具有类似属性的方法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避免与属性、常量和方法混淆。

于 2013-01-16T17:08:22.087 回答
-1

我没有看到 MyCar 被初始化,也没有任何异常处理。因此你的程序一定会崩溃

于 2013-01-16T15:45:17.100 回答
-1

您必须覆盖类的 toString() 方法

        public override string ToString()
    {
        return comboBoxBrand.Text +"\r\n"+comboBoxYear.Text;
    }
于 2013-01-16T15:44:27.650 回答