所以我从同事那里得到了一个 panic 的即时消息,说这个 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
然后再次运行代码,这表明我猜测脏实际上是 false

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

编辑

所以 MyBase.IsDirty 是一个 bool 值

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 的书中显示它是这样做的。

最佳答案

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

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

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

关于.net - MyBase(基础)对象属性未在调试器中显示实际值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4725740/

10-13 03:12