【VB】二項論理演算子(And,Or)について【ショートサーキット評価(短絡評価)】
VB2005、VB6、VB.NETに限った話?だと思う。たぶん。
VB6に合わせた仕様だと思う。たぶん。
ということはVB6以降は同じになるのかな?たぶん。
Access(VBA)をVB.NETに移行(プレリリース)するという案件があったのですが、
実はVB.NET案件はその時が初めてだった俺氏が、「なんで?」と思ったところ。
もともとVBはあまり勉強してなかったせいだけど。。。
というかVBAをVB.NETに簡単に移行できると思ってた上司がムカつく・・・
まぁそれはいいか。
?ショートサーキット評価(短絡評価)
俺氏はそれまでショートサーキット評価という言葉自体を知らなかったのだけど、
C#.NETで以下のようなIF文を書いたとする。
C#.NET
DataTable dt = null; if (dt == null || dt.Rows.Count <= 0)
これをVB.NETをよく知らずに以下のように書くとExceptionが発生する
VB.NET
Dim dt As DataTable = Nothing If dt Is Nothing Or dt.Rows.Count <= 0 Then
当時の俺氏は、1番目の式(dt Is Nothing)がTrueだった時点で、
2番目の式(dt.Rows.Count <= 0)は評価されないものと思っていた。
だがしかし、見事に違っていた。
これはVB2005、VB6、VB.NETのAnd,Orがショートサーキット評価ではないから。
ショートサーキット評価というのは、
「結果が決まってしまえば残り(右辺)は評価しても意味ないので評価しないよ」
って感じの評価方法。だったはず。
C#.NETのAnd(&&),Or(||)の場合はショートサーキット評価なので、
1番目の式(dt == null)がTrueの時点で2番目の式は評価されない。
Or(||)はBool式の論理和を求めるので、
2番目の式がTrueでもFalseでも結果は変わらないため。
逆にAnd(&&)の場合はBool式の論理積を求めるので、
1番目の式がFalseの場合は2番目の式は評価されない。
VB2005、VB6、VB.NETでのショートサーキット評価
当時の俺氏はショートサーキット評価という言葉自体知らなかったから「?」ってなったわけですよ。
そしていつもお世話になってるグーグルさんに「vb.net if or 演算子」と入力して検索すると、
VB .NET プログラミングリファレンス - 3-4 演算子
が1番目にヒットしたので見てみると、「OrElse,AndAlso」なる文言を発見!!
そっからその単語で検索して・・・フムフム
「VB.NETではOrElse,AndAlsoを使えばショートサーキット評価になるのか」となってスッキリ。
詳しい説明は以下参考
Visual Basic での "ショートサーキット" 評価の説明
当たり前と思ってた部分が違うとちょっと焦るよね(^_^;)