所以我从一个同事那里得到了一个 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/