-3

我来自 c++ 背景,我对这样的陈述之一感到困惑

   if TUtils.CheckValue(objData, LChan) and
         (LChan.Int.Value = (aObject as TomDBChan).Int.Value) then
   begin
          //Operation
   end;

可以将其转换为

         LChan.Int.Value = (aObject as TomDBChan).Int.Value ;
          if TUtils.CheckValue(objData, LChan) then
          begin
            //Operation
          end;

或者我还应该检查 LChan.Int.Value 是否有一些价值?

4

2 回答 2

2

如果您的目标是防止任何短路评估,只需确保分别计算表达式的组成部分:

b1 := TUtils.CheckValue(objData, LChan);
b2 := (LChan.Int.Value = (aObject as TomDBChan).Int.Value);

if b1 and b2 then
begin
   //Operation
end;

这确保了 CheckValue() 或 .Value 方法中的任何副作用都将被执行。

于 2013-09-20T06:39:45.090 回答
1

更清楚的是:您建议的重构不正确。

语句:“LChan.Int.Value = (aObject as TomDBChan).Int.Value”返回 true 或 false,将它放在 if 条件之外是没有意义的。

你不能盲目地重构短路评估。这是因为如果左侧为假,则不会评估右侧。这样做会改变您的程序逻辑。

我不能说 checkvalues 做了什么,但如果它检查空指针怎么办?如果您将其重构为:

b1 := TUtils.CheckValue(objData, LChan);
b2 := (LChan.Int.Value = (aObject as TomDBChan).Int.Value);

事实证明 LChan 将为空,然后您的程序将在 b2 := ... 上引发异常,因为 LChan.Int 在以前不会引发异常的地方不存在。

LChan.Int.Value = (aObject as TomDBChan).Int.Value 检查它们是否相等,它不会将 (aObject as TomDBChan).Int.Value 分配给 LChan.Int.Value。

于 2013-09-20T07:15:30.583 回答