我在我的 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());
}
我可能会得到一个调用基类的迭代:
> ...
> crunch
> crunch
> crunch
> whirr
> crunch
> ...
现在我的实际场景是使用实体框架并且错误发生在 EntityContext.SaveChanges() 方法中,因为我的覆盖中的某些事情没有发生,并且堆栈跟踪显示覆盖被跳过,但上面的代码代表症状。
我的问题是:(1)这可能吗?(2) 可以预防吗?