c#运行时有时会跳过覆盖

时间:2012-09-26 13:53:18

标签: c# runtime override

我在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
> ...

现在我的实际场景是使用Entity Framework,并且错误发生在EntityContext.SaveChanges()方法中,因为我的覆盖中的某些内容没有发生,并且堆栈跟踪显示覆盖被跳过,但上面的代码是代表性的症状。

我的问题是:(1)这可能吗? (2)可以预防吗?

2 个答案:

答案 0 :(得分:5)

您的Gear类需要将Spin函数标记为虚拟:

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

在我的测试中,我得到了1000英寸的“仰卧起坐”。

如果您的EntityContext.SaveChanges()方法中发生了这种情况,那么遗憾的是,发布的代码无法代表问题。

答案 1 :(得分:0)

旋转类齿轮的方法需要标记为虚拟,实际上我很惊讶这个编译

我的测试(设置为虚拟)工作正常