MyBase(base)Object属性未在调试器中显示实际值

时间:2011-01-18 15:14:37

标签: .net visual-studio debugging virtual

所以我从一位同事那里得到一个惊慌的IM,如果声明在

时跳过,那就说了
If true Then
    DoSomething
End IF

实际代码是

If MyBase.IsDirty Then
    DoSomething
End IF

C#版本

if(base.IsDirty)
{
    DoSomething();
}

我向他们提出的第一个问题是If声明没有被神奇地打破,所以你确定MyBase.IsDirty实际上是真的吗?他们回答'是的当然!'。在询问他们如何确定这一点后,他们说他们在线上放置了一个断点,并在MyBase.IsDirty上空盘旋,看看价值是多少,他们在前一个窗口也做了?MyBase.IsDirty。我最初的想法和我想要的仍然是正确的是由于基类运行的方式,它实际上并没有在那些情况下显示值(至少是正确的)所以我建议做

Dim dirty As Boolean = MyBase.IsDirty

然后再次运行代码,这表明我确实认为脏实际上是false

现在为什么会这样?据我所知,它与MyBase的实现方式有关,但我想要具体细节,所以我可以100%回答这个问题。

修改

正确MyBase.IsDirty是一个布尔

Get完成如下:

<Browsable(False)> _
    Public Overridable ReadOnly Property IsDirty() As Boolean Implements IEditableBusinessObject.IsDirty
      Get
        Return IsSelfDirty OrElse (_fieldManager IsNot Nothing AndAlso FieldManager.IsDirty())
      End Get
    End Property

哪里

<Browsable(False)> _
    Public Overridable ReadOnly Property IsSelfDirty() As Boolean Implements IEditableBusinessObject.IsSelfDirty
      Get
        Return _isDirty
      End Get
    End Property

并且

_isDirty已初始化为true

(对于这种情况,现场经理不是问题。)

我应该注意到这一切都取自CSLA 3.5.3.0

另一个编辑

我正在调用MyBase.IsDirty,因为这是Rocky Lhotka在他的CSLA书籍中显示它的方式。

1 个答案:

答案 0 :(得分:6)

调试器无法正确使用base(或VB中的MyBase)关键字来计算表达式,因为调试API不支持非虚拟调用。它返回对getter返回的虚拟调用的值,而不是基类返回的getter返回的值。因此,您观察到的效果是调试器问题。

我猜你在派生类中覆盖属性并在那里返回false,这就是调试器显示的内容。编译后的代码本身将正确处理base.调用。

MSDN博客文章"Debugger won't properly evaluate C#s base keyword"详细描述了此问题