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());
}

我可能会得到一个调用基类的迭代:

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

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

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

4

2 回答 2

5

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

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

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

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

于 2012-09-26T13:56:36.267 回答
0

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

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

于 2012-09-26T13:57:06.750 回答