.net - MyBase(基础)对象属性未在调试器中显示实际值

标签 .net visual-studio debugging virtual

所以我从一个同事那里得到了一个 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 在即时窗口中。我最初的想法和我现在认为仍然正确的想法是由于基类的运作方式,它实际上并没有在那些情况下显示值(value)(至少是正确的)所以我建议做

Dim dirty As Boolean = MyBase.IsDirty

然后再次运行代码,正如我猜测的那样,dirty 实际上是 false

为什么会这样呢?据我所知,它与 MyBase 的实现方式有关,但我想要具体细节,以便对此有 100% 的答案。

编辑

没错 MyBase.IsDirty 是一个 bool 值

获取方式如下:

<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/

相关文章:

visual-studio - 尝试从 Docker 中的 VS 运行时出现错误 "getcwd() failed: No such file or directory"

visual-studio - 如何在 Visual Studio 的 CMake 支持下运行 INSTALL?

c++ - gdb:在添加的符号文件系统提供的 DSO 中找不到可加载的部分 0x#number#

c# - 预启动任务构建以退出代码 1 终止

c# - wpf - 将数据上下文绑定(bind)到单例类的静态属性

android - 将 .NET dll 移植到不同的平台

c# - 我在哪里可以得到 NLog 提供的 "ambient properties"的列表?

c# - 如何获取原型(prototype)文件来引用另一个原型(prototype)中定义的消息?

visual-studio - 可维护性指标

android - 使用 android :debuggable ="false" 调试 Ionic 应用程序