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

msa*_*het 3 .net debugging virtual visual-studio

所以我从一位同事那里得到了一个惊慌的即时通讯,如果声明正在跳过那么

If true Then
    DoSomething
End IF
Run Code Online (Sandbox Code Playgroud)

实际的代码是

If MyBase.IsDirty Then
    DoSomething
End IF
Run Code Online (Sandbox Code Playgroud)

C#版本

if(base.IsDirty)
{
    DoSomething();
}
Run Code Online (Sandbox Code Playgroud)

我对他们的第一个问题很好,If声明没有被神奇地打破,所以你确定MyBase.IsDirty它是真的吗?他们回答'是的当然!'.在询问他们如何确定这一点后,他们说他们正在线路上设置一个断点,然后盘旋过来MyBase.IsDirty看看它的价值是什么以及它们是否也在?MyBase.IsDirty即时窗口中完成了.我最初的想法和我想要的仍然是正确的是由于基类运行的方式,它实际上并没有显示那些情况下的值(至少是正确的)所以我建议做

Dim dirty As Boolean = MyBase.IsDirty

然后再次运行代码,这表明我确实认为脏了false.

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

编辑

MyBase.IsDirty是一个布尔值

获得完成如下:

<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
Run Code Online (Sandbox Code Playgroud)

哪里

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

_isDirty 初始化为true

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

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

另一个编辑

我正在调用MyBase.IsDirty,因为这是Rocky Lhotka表明它在CSLA的书中完成的方式.

Cod*_*aos 6

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

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

MSDN博客条目"调试器将无法正确评估C#的base关键字"详细描述了此问题