VB.NET言語と何もない:なぜそうなっているのですか?
-
06-07-2019 - |
質問
これはVB.NET言語に関する質問です。私は毎日使っているので、その構成要素の背後にある動機を理解しようとしています。
この行がわかりました:
If myObject Is Nothing then
これと同じくらい正しい:
If Nothing Is myObject Then
同じ結果。 ildasmを使用すると、これらの行が次のように翻訳されていることがわかります。
if myObject = null then
and
if null = myObject then
まあ、しかし、VB.NETでは、書くことはできません:
if myObject = Nothing Then
コンパイラはそれを受け入れません。
うーん、 MyObjectがNoObjectの場合 は、 MyObject = Nothingの場合 よりはるかにわかりにくい。
なぜVB.NETの著者は反対のことを考えたのですか?ヒントは?
解決
実行中の問題は、VB.Netが2種類のオブジェクト比較を区別することです。すなわち、参照と値の比較。
<!> quot; Is <!> quot; VB.Netの演算子は、参照の比較に使用されます。これは、問題の値が両方とも参照型またはヌル値可能の場合に使用できます。この方法で値の型を比較しようとすると、コンパイルエラーが発生します。
<!> quot; = <!> quot;演算子は値の比較に使用されます。値の比較は、明示的な=、<!> lt; <!> gt;を定義する型でのみ使用できます。クラス定義の演算子ペア。等式の実際の実装は、演算子の実装に依存します。
C#は、値と参照の比較に==を使用するという点で異なるアプローチを取ります。どちらが使用されるかは、比較される値のタイプや特定の等価メソッドの実装など、いくつかの要因に依存します。
他のヒント
これは、VB6およびCOMから継承されたこれらのものの1つです。 VB6は、インスタンス化可能な参照型オブジェクトとintなどのネイティブ型を区別します。参照タイプを作成し、<!> quot; Set <!> quot;で割り当てる必要がありました。ネイティブ型は単に<!> quot; = <!> quot;を使用したのに対し、演算子。
まあ、場合によってはIf myObject = Nothing Then
と書くことができますが、null比較ではありません:
Dim someValue As Integer
If someValue = Nothing Then
' do something '
End If
上記のコードは次と同等です:
Dim someValue As Integer
If someValue = 0 Then
' do something '
End If
この場合、<!> quot; emtpy <!> quot;を持つ値型があります。値(Integer
の場合は0、 Point.Empty
例としてPoint
構造の場合は)。 Is演算子は参照比較(比較されたオブジェクトが同じインスタンスであるかどうかを確認)を実行し、等号は値の比較です。
別の考えは、VBはループと条件付き構文の一部を見ると、より冗長になることを意図していると考えています。いくつかの例:
VB:
If x==0 Then
End If
While
End While
For i = 0 to 10 Step 2
Next i
C#
If x==0
{
}
While
{
}
for (int i = 0; i<=10;i+2)
{
}
VB.Netコードの余分な単語をすべて表示しますか?それが違いのもう一つの考えられる理由です。
Is Nothing
の使用は、古典的なVisual Basicの時代(つまり6.0以前)に遡る構造です。
互換性をある程度維持するため(VB6がIf
ステートメントの非遅延評価を処理する方法と同様)、これはVB.NETに引き継がれています。
幸いなことに ocdecio が指摘するように、オブジェクトを変数に割り当てるためのSet
ステートメントなど、VB.NETに持ち越されていない他の同様のペッカディロがありました。