所以我从一位同事那里得到一个惊慌的IM,如果声明在
时跳过,那就说了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
是一个布尔
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书籍中显示它的方式。
答案 0 :(得分:6)
调试器无法正确使用base
(或VB中的MyBase
)关键字来计算表达式,因为调试API不支持非虚拟调用。它返回对getter返回的虚拟调用的值,而不是基类返回的getter返回的值。因此,您观察到的效果是调试器问题。
我猜你在派生类中覆盖属性并在那里返回false
,这就是调试器显示的内容。编译后的代码本身将正确处理base.
调用。
MSDN博客文章"Debugger won't properly evaluate C#s base keyword"详细描述了此问题