-3

私はC ++のバックグラウンドから来ており、このようなステートメントの1つと混同しています

   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 条件の外に配置しても意味がありません。

盲目的に短絡評価をリファクタリングすることはできません。これは、左側が false の場合、右側が評価されないためです。これを行うことで、プログラムのロジックが変わります。

checkvalues が何をするのかはわかりませんが、null ポインターをチェックするとどうなるでしょうか? 次のようにリファクタリングする場合:

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

そして、LChan が null になると、プログラムは 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 に答える