【问题标题】:MyBase (base) Object Property not showing actual value in the debuggerMyBase(基础)对象属性未在调试器中显示实际值
【发布时间】:2011-01-18 15:14:37
【问题描述】:

所以我从一位同事那里收到一条惊慌的即时消息,说这个 if 语句正在跳过时

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

然后再次运行代码,我猜到dirty实际上是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 被初始化为真

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

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

另一个编辑

我之所以打电话给 MyBase.IsDirty,是因为 Rocky Lhotka 在他关于 CSLA 的书中表明这是这样做的。

【问题讨论】:

  • IsDirty的类型是什么?
  • 如果MyBase 是一个属性,那么看看Get 是如何完成的会很有用。
  • @Justin:从他发布的代码来看,这似乎是Boolean。同意@Shimrod;请发布您的IsDirty 财产。顺便说一句,你为什么打电话给MyBase.IsDirty 而不是IsDirty?您是否在当前类中覆盖它并且想要绕过该逻辑?
  • @Adam Robinson 看到编辑,@Shimrod 在编辑中,@Justin 是的......
  • @CodeInChaos,请详细说明答案,这正是我想要的类型。

标签: .net visual-studio debugging virtual


【解决方案1】:

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

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

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

【讨论】:

  • 这是我的想法,但我找不到任何具体/官方的内容。
  • @msarchet 找到了 msdn 博客
猜你喜欢
  • 1970-01-01
  • 2016-04-23
  • 2019-01-25
  • 1970-01-01
  • 2016-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-13
相关资源
最近更新 更多