読者です 読者をやめる 読者になる 読者になる

俺氏、本を読む

30歳になるまでに本を読んで勉強しようかと。主に啓発、お金についての本を読むつもり。一応プログラマーなのでその辺のことも

【VB】二項論理演算子(And,Or)について【ショートサーキット評価(短絡評価)】

VB

VB2005、VB6、VB.NETに限った話?だと思う。たぶん。

VB6に合わせた仕様だと思う。たぶん。

ということはVB6以降は同じになるのかな?たぶん。

 

Access(VBA)をVB.NETに移行(プレリリース)するという案件があったのですが、

実はVB.NET案件はその時が初めてだった俺氏が、「なんで?」と思ったところ。

もともとVBはあまり勉強してなかったせいだけど。。。

というかVBAVB.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 での "ショートサーキット" 評価の説明

 

当たり前と思ってた部分が違うとちょっと焦るよね(^_^;)

 

広告を非表示にする