1

私のc#コードであいまいなランタイムクラッシュバグが発生しています。スタックトレースから、オーバーライドがスキップされることがまれにあり、代わりに基本クラスのメソッドが呼び出されているように見えます。擬似コードは次のようになります。

public class Widget : Gear
{
    public override string Spin()
    {
        return "crunch";
    } 
}

public class Gear
{
    public virtual string Spin()
    {
        return "whirr";
    }
}

そして、私がこれを千回呼ぶと、次のようになります。

var widget = new Widget();
for (var i = 0; i < 1000; i++)
{
   Console.WriteLine(widget.Spin());
}

代わりに、基本クラスを呼び出す反復が1回発生する可能性があります。

> ...
> crunch
> crunch
> crunch
> whirr
> crunch
> ...

現在、私の実際のシナリオはEntity Frameworkを使用しており、オーバーライドで何かが発生しなかったため、EntityContext.SaveChanges()メソッドでエラーが発生し、スタックトレースはオーバーライドがスキップされたことを示していますが、上記のコードは症状。

私の質問は次のとおりです。(1)これは可能ですか?(2)予防可能ですか?

4

2 に答える 2

5

Gear クラスは、Spin 関数を仮想としてマークする必要があります。

class Gear {
  public virtual string Spin() {
    return "whirr";
  }
}

私のテストでは、1,000回の「クランチ」がありました。

これがEntityContext.SaveChanges()メソッドで発生している場合、投稿されたコードは残念ながら問題を表していません。

于 2012-09-26T13:56:36.267 に答える
0

メソッド Spin on class gear は仮想としてマークする必要があります。実際、これがコンパイルされることに驚いています

私のテスト(仮想に設定されている)は正常に動作します

于 2012-09-26T13:57:06.750 に答える