web-dev-qa-db-ja.com

<>そしてVB.NETにはない

VB.NETの<>演算子とNot演算子について調べるエキサイティングなタスクがあります。 Not-私はそれを少し使用することを想定しています-C#や!などの言語の<>と機能的に同等であり、!=と同等です。

VB.NETでよくある問題は、参照を持たないオブジェクトに対してブール式を実行することです。もしそうなら

If Request.QueryString("MyQueryString") <> Nothing Then

クエリ文字列が存在しない場合、これは実際に失敗します。なぜか分からない。古いコーダーが行う方法は次のとおりです。

If Not Request.QueryString("MyQueryString") Is Nothing Then

そして、これはうまくいく傾向があります。私にとっては機能的には同等ですが、演算子は演算子の優先順位などの特定の要因に応じて異なる比較を行う傾向がありますが、なぜこの場合にうまくいかないのかはわかりませんが、関連する資料も見つかりませんでした。

私は標準のドキュメントを書かなければならないのでこれを頼み、私たちはNotまたは<>のどちらの使用を決定しているのです。それを回避する方法についてのアイデア、またはshould実行しますか?

22
Kezzer

私はいつも以下を使用しました:

If Request.QueryString("MyQueryString") IsNot Nothing Then

しかし、構文的には読みやすいからです。

有効なQueryStringエントリをテストするとき、次も使用します。

If Not String.IsNullOrEmpty(Request.QueryString("MyQueryString")) Then

これらは私がいつも使用している方法に過ぎないため、コードを読み返すときに最も意味がある以外の使用法を正当化することはできませんでした。

31
Charlie

Is=と同じではありません-Isは参照を比較しますが、=は値を比較します。

.Net Framework(またはそれ以降)のv2を使用している場合、IsNot演算子があり、これは正しいことを行い、より自然に読みます。

10
Rowland Shaw

あなたの質問は、「(Is=)および(IsNotおよび<>)」。

両方の場合の答えは同じです:

=および<>は、値の型に対して暗黙的に定義されており、型に対して明示的に定義できます。

IsIsNotは、2つの参照が同じオブジェクトを参照しているかどうかを確認するために、参照タイプ間の比較用に設計されています。

この例では、文字列オブジェクトをNothing(Null)と比較しており、=/<>演算子は文字列に対して定義され、最初の例が機能します。ただし、文字列は参照型であり、Nullになる可能性があるため、Nullが検出されると機能しません。 (ご想像のとおり)より良い方法は、Is/IsNotを使用する後者のバージョンです。

9
Cerebrus

技術的な答えは次のとおりです(Rowland Shawの答えを拡大)。

Isキーワードは、2つのオペランドが同じオブジェクトメモリへの参照であるかどうかをチェックし、その場合にのみtrueを返します。機能的にはObject.ReferenceEqualsと同等だと思います。 IsNotキーワードは、単にNot ... Is ...、 これ以上何もない。

=(等式)演算子は値を比較し、この場合(他の多くの場合と同様)はString.Equalsと同等です。現在、<>(不等式)演算子はIsおよびIsNotキーワードと類似していないため、個別にオーバーライドできるため、クラスに応じて=演算子から。私は、=演算子の論理逆数を返すこと(そして確かにStringの場合)であり、不平等をテストするときより効率的な比較ができるようにすることを常に考えるべきです平等より。

文字列を扱うときは、実際に参照を比較するつもりでない限り、常に=演算子(またはString.Equalsの場合)を使用してください。あなたのケースでは、null(Nothing)をテストしているため、IsまたはIsNotキーワード(等価演算子nullオブジェクトの値を比較できないため失敗します)。構文的には、IsNotキーワードの方が少しいいので、それに合わせてください。

1
Noldorin

どちらが良い音を使用してください。ただし、操作が少ないように見えるため、最初のアプローチを使用します。

0
luiscubal

変数が存在するかどうかを知る必要がある場合は、Is/IsNot Nothingを使用します。

<>を使用するには、評価する変数に「<>」演算子が定義されている必要があります。チェックアウト

 Dim b As HttpContext
 If b <> Nothing Then
    ...
 End If

結果のエラー

Error   1   Operator '<>' is not defined for types 'System.Web.HttpContext' and 'System.Web.HttpContext'.   
0
hometoast

C#およびVB.NETコンパイラは、多くの場合、両方の言語で明らかに同等の操作に対して異なるILを生成します。あなたがstringvar == null、VB.NETはサポートしていません。 VB.NETで同じ効果を得るには、Is演算子で真の参照の等価性を強制する必要があります。

0

開発者にとっては、値と比較するために演算子==をオーバーライドしたい場合があるためです。クラスAがあるとします。演算子== Aは、Aのフィールドの一部をパラメーターと比較することです。次のコードでAのオブジェクトがnullであるかどうかを確認するためにc#で問題が発生します

    A a = new A();
...
    if (a != null)
it will totally wrong, you always need to use if((object)a != null)
but in vb.net you cannot write in this way, you always need to write
    if not a is nothing then
or
    if a isnot nothing then

クリスチャンが言ったように、vb.netは何も「期待」していません。

0
Hzj_jie

私は完全な初心者です。VBの「等しくない」構文を理解するためにここに来たので、他の誰かがそれを必要とする場合に備えて、ここにそれを投げると思いました。

<%If Not boolean_variable%>Do this if boolean_variable is false<%End If%>
0
Travis Heeter