4

VB.NET に==は比較用の演算子がないため、=演算子は代入だけでなくその目的にも役立ちます。関数があり、その結果を変数に格納せずに、比較のブール結果を返すようにしたい:

Private Function foo() As Boolean
    Dim bar As Integer = 1
    Return bar = 2
End Function

戻り値:False

わかりましたが、 の値はbar何ですか?

Private Function foo() As KeyValuePair(Of Boolean, Integer)
    Dim bar As Integer = 1
    Return New KeyValuePair(Of Boolean, Integer)(bar = 2, bar)
End Function

戻り値:False, 1

=ステートメントのコンテキストが要求したときに比較を実行するように見えますが、これは保証されていますか? つまりbar、この状況で が 2 に設定されることはないと確信できますか?

また、VB.NET では連鎖したインライン割り当てが許可されていないこともわかっています。この奇妙=な動作は、私が注意する必要がある他の癖を引き起こしますか?

4

4 に答える 4

3

VB でインライン割り当てを行うことはできません。割り当ては明示的なステートメントです。

[Let] <<target-reference>> = <<value-expression>>

はオプションで暗黙的であり、現在Letではほとんど使用されていません。[Let]コマンドを等価テストと区別するために使用できる一般的なルールは、 for Let、ステートメント内の target-reference の前に他のキーワードを指定しないことです。私の知る限り、同等性テストのすべてのケースで=、ステートメントの前に1つ以上の他のキーワードがあります。

最初の例では、キーワードReturnが の前=にあるため、これは等価テストであり、代入ではありません。

最初の例では、次のいずれかを実行できます。

Return 2

また

bar = 2
Return bar

あなたの質問については、「わかりましたが、bar の値は何ですか?」、barそれでも 1 です。

=VB では癖はありません。それは文書化されているとおりに正確に動作し、常に動作します (前身である 1968 年までの BASIC を含む)。

于 2013-10-17T16:43:48.423 に答える
3

(C# などの言語から) VB でコーディングを開始する場合は、VB 特有の作業方法に慣れる必要があります。これは、プログラマーにとって可能な限りシンプルで直感的なアイデアに基づいています。「割り当てと比較が常に異なるコンテキストで発生する場合、同じ演算子を使用して、コンテキストがその正確な意味を定義できるようにしないのはなぜですか?」-> VB-物の見方。「いいえ、異なる現実は異なるオペレーターによって説明されなければなりません。議論の終わり」 -> C#-way. :)

これは信頼できますか?これらのプログラマーにとって常に明確ではないビットを盲目的に信頼できますか? 確かに、VB.NET の特性は信頼性が高く信頼できます。いつでも使用でき=(またはIs一部のコンテキストでは、VSが教えてくれます)、コードが期待どおりに動作することを完全に確認できます。しかし、問題は、あなたが書きたいことを正確に書いていると確信していますか?

この最後の質問は、おそらく VB に対してより批判的であり、他の言語のプログラマーに問題を引き起こす可能性があるものは何かということです。柔軟性が高いほど、エラーを犯す可能性が高くなります。主に、別の形式に慣れている場合。

チェーン化されたインライン割り当てに関しては、正直なところ、その真の有用性がわかりません (C# では決して使用しません)。C# に関するその他の違いについては、たくさんあります。場合によっては、C# のアプローチの方が優れていると思います。それ以外の場合は、VB.NET のものです。コードの読みやすさ/長さについては、C# には存在しない便利なWith ステートメントを参照できます。

于 2013-10-17T16:41:10.443 に答える
0

QB45 の時代には、"True" が数値 -1 であるという事実を悪用していました。したがって、次のようなコードが表示されますx = 1 - x * (x < 6)(翻訳: x をインクリメントしますが、6 になると 1 にリセットされます)

于 2013-10-18T00:40:38.200 に答える