質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

2189閲覧

VB.NETにおける短絡評価の実行順序が分からない

iwaki08

総合スコア1

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2020/06/09 02:00

編集2020/06/09 02:15

VB.NETにおける短絡評価の実行順序について

初質問になります。

現在VisualStudioで言語はVB.NETを使用してシステム開発をしております。

その際に、ある異なるリスト二つに対してどちらのリストの要素も存在する場合に処理を行いたく
又、そのリストの内一つは要素がある確率が低いので短絡評価を用いることにしました。
要素のリストが存在するかを確認するのに、社内ライブラリの関数を使用しています。
簡単に言うと、リストの要素がないときはFalseを返して、ある時はリストに対するAny関数を実行した結果を返すというものです。
戻り値はBool値なので、どちらに対してもBool値で評価して短絡評価で条件式を評価できると思ったのですが、
どちらもTrueの場合でも条件式以下の処理を実行できません。
短絡評価の実行順序を調べるにはどうしたらよいでしょうか。

##処理

If リスト1.社内のある関数 AndAlso リスト2.社内のある関数 Then  したい処理 End If

##試したこと
・短絡評価を使用しなければ社内の関数を使用しても正しい評価を行うことができました。
・又、社内の関数を使用せずにリストに対してLinqのAny関数を使用してBool値を返すようにしても正しい評価を行うことができました。

以上2ケースに対してうまくいくことから、社内のある関数を使用して短絡評価を使用したときのみ正しく評価を行うことができないので
なぜなのか気になって質問してみました。

##補足
先ほど試したら、Any関数でも正しく評価できませんでした。
尚、Any関数とはSystem.linq名前空間内のAny関数のことで、
正しく評価できたと勘違いしたケースはSystem.Collection.ObjectModel名前空間内のCountフィールドを使用して
0以上の場合をTrueとしたときでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Rocky

2020/06/09 02:15

①短絡評価の実行順序を調べるにはどうしたらよいでしょうか。 とありますが、本件の趣旨とは関係ないのでは? ②短絡評価を使用しなければ社内の関数を使用しても正しい評価を行うことができました。 とありますが、この手順の実施が少し怪しい気がします。
YAmaGNZ

2020/06/09 02:15

ログを出力してみることはできないのですか?
YAmaGNZ

2020/06/09 02:23

AnyでもNGとのことなのでふと思いましたが、遅延評価されているのではないですか?
iwaki08

2020/06/09 02:31

YamaGNZ様 ご指摘の通り遅延評価を行っておりました。 条件式の左辺と右辺の間の論理演算子をAndに変更してみたところ正しい評価を行うことができました。 ただ、論理演算子をAndに変更した後もこの社内の関数を使用すると正しい評価を行うことはできませんでした。
YAmaGNZ

2020/06/09 02:42

社内関数で正しい評価を行えないのは、原因が異なる気がします。 結果を変数で受けてみて、戻り値が確実に期待通りなのか確認してみてはどうでしょうか?
Rocky

2020/06/09 02:42

条件式の左辺と右辺の間の論理演算子をAndに変更してみたところ正しい評価を行うことができました。 ただ、論理演算子をAndに変更した後もこの社内の関数を使用すると正しい評価を行うことはできませんでした。 とはどういう意味ですか? 回答しましたがANDやANDALSOの動作そのものを検証するのはナンセンスですので、不確定要素だけ洗い出してさらに議論を進めたいです。 そのためにもYAmaGNZさんのご指摘通り、評価前後でのログは欲しいところですね。
YAmaGNZ

2020/06/09 02:44

すみません。当方で実験してみましたが、特に問題なく実行できました。 遅延評価ということもなかったです。 現象が確認できる最低限のコードを示してもらえませんか?
iwaki08

2020/06/09 03:45

Rocky様、YAmaGNZ様 回答ありがとうございます。 大変申し訳ないのですが、当方が原因と考えていた箇所ではなく、条件分岐後の処理に問題があることが分かりました。 処理を適切にしたら思った出力を得ることができました。 又、以下にログを出力するコードを記載します。社内関数と書き換えている箇所から返ってくる値もログ出力したらTrueだったので問題ありませんでした。 Dim list1 As New ObservableCollection(Of Integer)({1, 2, 3}) Dim list2 As New ObservableCollection(Of Integer)({1, 2, 3}) '処理成功 If list1.Any AndAlso list2.Any Then Debug.WriteLine("処理成功") Else Debug.WriteLine("処理失敗") End If '処理成功 If list1.Any And list2.Any Then Debug.WriteLine("処理成功") Else Debug.WriteLine("処理失敗") End If '処理成功 If list1.社内関数 AndAlso list2.社内関数 Then Debug.WriteLine("処理成功") Else Debug.WriteLine("処理失敗") End If '処理成功 If list1.社内関数 And list2.社内関数 Then Debug.WriteLine("処理成功") Else Debug.WriteLine("処理失敗") End If 尚、list1とlist2をobservablecollectionとしているのは実際の処理で条件式に使用しているリストの型に合わせているためです。
iwaki08

2020/06/09 03:50

回答いただきありがとうございました。当方の調査不足ではありましたが、YAmaGNZ様とRocky様のおかげで問題解決に至りました。 今回は回答としていただいたRocky様をベストアンサーとしております。 又、お二方ともフォローいたしましたので、よろしければこれからもよろしくお願いいたします。
guest

回答1

0

ベストアンサー

懸念事項については追記依頼を参照ください。
あくまで普遍的な内容に限って回答を以下のとおり示します。

VB.net

1If A AndAlso B Then 2 Func() 3End If

VB.net

1If A Then 2 If B Then 3 Func() 4 End If 5End If

と同じ意味になります。
(それ以上でも以下でもありません、ご自身のコードの他の部分を疑ってください)

投稿2020/06/09 02:16

編集2020/06/09 02:17
Rocky

総合スコア261

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

iwaki08

2020/06/09 02:28

回答いただきありがとうございます。 先ほど補足を質問に追加しましたが、当方が短絡評価の両辺で用いていたAny関数がSystem.linq名前空間のAny関数のため遅延実行される処理になり、短絡評価を使用したらうまく評価できないのかと考えました。 リストのCountが0以上を条件としたら短絡評価でも正しく評価できたので、遅延実行する場合は短絡評価を使用してはいけないのでしょうか。
Rocky

2020/06/09 02:53

linqが遅延実行される点に着目されたのですね。 関数の内部処理や戻り値がはっきりしないことが気になりますね。 >(評価式が内部的に)遅延実行する場合は(その評価式に対して)短絡評価を使用してはいけないのでしょうか。 断言できませんが、、、、その可能性は薄いのではないかと、、、他にどなたか識者はいますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問