-1

以下にコードを掲載しました。

私の問題は、私が使用しているときにプログラムがクラッシュすることです:

myCarLabel.Text = MyCar.ToString();

私は何を間違えましたか?

myCarLabelMyCar.Brandとの間で値を出力したいと考えています。MyCar.Year

それは次を使用して動作します:

しかし、その後、クラスなどを使用してポイント全体を失います..何か提案はありますか?

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();
  • またはMyCarnullです

  • またはmyCarLabelnullです

  • またはそれらの両方

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使用するため、クラスはクラスの関数を使用します。最後に、式を使用する必要はありません。関数の 4 行目で like を使用するだけです(myCarLabel.Text = MyCar)ToString()VehicleCarToString()ObjectMyCar.Tostring()MyCarbutton1_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;
}
于 2013-01-16T16:14:35.440 に答える
0

クラッシュの原因を特定するために、次の 2 つのチェックを行います。

  • Form.Loadイベントがメソッドに適切に設定され、呼び出されていることを確認してください。最初の行または括弧内にブレークポイント ( F9Form1_Load ) を設定して、確実にヒットするようにすることができます。

  • 行にブレークポイントを設定しますmyCarLabel.Text = MyCar.ToString()myCarLabelと の両方にマウスをMyCar合わせて、デバッガーで null でないことを確認します。

コードの改善については、次のとおりです。

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内でインスタンスを作成します。これは、への変更がオブジェクトに反映されないことを意味します。したがって、ユーザーが選択したBrandまたはYearを変更しても、オブジェクトは更新されません。イベントに移動することを検討してください。Form.LoadComboBoxButton.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また、このために a をメンバー変数として格納する必要はありません。カスタム ダイアログが必要な場合、またはForm車のエントリを追加/編集する場合は、 custom に を返す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

于 2013-01-16T17:08:22.087 に答える
-1

クラスの toString() メソッドをオーバーライドする必要があります

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

例外処理ではなく、初期化されている MyCar が表示されません。したがって、あなたのプログラムは必ずクラッシュします

于 2013-01-16T15:45:17.100 に答える