24

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

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

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

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

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

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

標準ドキュメントを作成する必要があり、Notまたはのどちらを使用するかを決定しているため、これをお願いします<>。それを回避する方法についてのアイデアはありますか、またはそれを行う必要がありますか?

4

9 に答える 9

33

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

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

しかし、構文的に読みやすいという理由だけです。

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

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

これらは私が常に使用してきた方法にすぎないため、コードを読み返すときに最も意味がある場合を除いて、それらの使用法を正当化することはできませんでした.

于 2009-03-16T11:03:28.607 に答える
11

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

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

于 2009-03-16T11:05:50.877 に答える
10

あなたの質問は、「(Is=)と(IsNotと<>)の違い」に要約されると思います。

どちらの場合も答えは同じです:

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

IsIsNot参照型を比較して、2 つの参照が同じオブジェクトを参照しているかどうかを確認するように設計されています。

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

于 2009-03-16T11:25:46.133 に答える
1

これが技術的な答えです(Rowland Shawの答えを拡張しています)。

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

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

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

于 2009-03-16T11:29:36.903 に答える
0

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

于 2009-07-28T12:36:05.607 に答える
0

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

于 2009-03-16T11:21:07.267 に答える
0

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

<%If Not boolean_variable%>Do this if boolean_variable is false<%End If%>
于 2013-04-01T14:25:13.577 に答える
0

変数が存在するかどうかを知る必要がある場合は、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'.   
于 2009-03-16T11:42:07.357 に答える