IsNothingとIs Nothing


130

ここで誰かがVB.NETを使用していて、(たとえば、または)IsNothingとは対照的に、使用することに対して、またはそれに対して強い好みがありますか?もしそうなら、なぜですか?Is NothingIf IsNothing(anObject)If anObject Is Nothing...

編集:両方が同じように受け入れられると思う場合は、1つを選んでそれを使い続けるのが最善だと思いますか、それともそれらを混ぜても大丈夫ですか?


3
使用を避けるべき多くの正当な理由がありますIsNothing()
カイルミット

@JesseChisholm、単一のコメントには多すぎますが、私の以前のコメントは、5つの異なるものを列挙する記事にこのリンクを投稿しましたblog.reneorban.com/2011/12/vbnet-isnothing-vs-is-nothing.html
KyleMit

技術的な回答は非常に興味深いものですが、残念ながら、質問は少しあいまいにされ、いくつかの回答が生成されましたが、個人的な好みがますますあいまいになりました
underscore_d

回答:


125

実行されているMSILを確認すると、まったく同じコードにコンパイルされていないことがわかります。IsNothing()を使用すると、式を評価するだけではなく、実際にそのメソッドを呼び出します。

「Is Nothing」の使用に傾く傾向があるのは、否定的に「Not IsNothing(object)」ではなく「IsNot Nothing」になると、個人的に読みやすくなります。


46

Patrick Steeleが彼のブログでこの質問に最もよく答えたことがわかります:IsNothing()の回避

Patrick Steeleが彼の投稿の功績を認められるようにするため、ここでは彼の回答はコピーしていません。しかし、Is NothingとIsNothingのどちらを使用するかを決定しようとしている場合は、彼の投稿を読む必要があると思います。Is Nothingが最良の選択であることに同意するでしょう。

編集-ここでVoteCoffeのコメント

記事の内容の一部:さらにコードを確認したところ、これを回避する必要がある別の理由がわかりました:値型を受け入れます!明らかに、IsNothing()は「オブジェクト」を受け入れる関数であるため、必要なものは何でも渡すことができます。値型の場合、.NETはそれをオブジェクトにボックス化し、IsNothingに渡します。ボックス化された値では常にfalseが返されます。VB.NETコンパイラは「Is Nothing」スタイルの構文をチェックし、値の型で「Is Nothing」を実行しようとするとコンパイルされません。しかし、IsNothing()関数は問題なくコンパイルされます。-PSteele –投票コーヒー


7
記事の内容の一部:さらにコードを確認したところ、これを回避する必要がある別の理由がわかりました:値型を受け入れます!明らかに、IsNothing()は「オブジェクト」を受け入れる関数であるため、必要なものは何でも渡すことができます。値型の場合、.NETはそれをオブジェクトにボックス化し、IsNothingに渡します。ボックス化された値では常にfalseが返されます。VB.NETコンパイラは「Is Nothing」スタイルの構文をチェックし、値の型で「Is Nothing」を実行しようとするとコンパイルされません。しかし、IsNothing()関数は問題なくコンパイルされます。-PSteele
VoteCoffee

7
リンクが切れてしまうかどうかわからないので、内容の一部を掲載しましたので、カバーに良いポイントがついたと思います。
VoteCoffee 2014年

33

絶対に使用しないでください IsNothing()

ここにある4つの理由の記事からIsNothing()VSです何も

  1. 最も重要なのは、IsNothing(object)すべてがオブジェクトとして、値型も含めてオブジェクトとして渡されることです。値の型をにすることはできないためNothing、完全に無駄なチェックになります。
    次の例を見てください。

    Dim i As Integer
    If IsNothing(i) Then
       ' Do something 
    End If

    これはコンパイルして正常に実行されますが、これは:

    Dim i As Integer
    If i Is Nothing Then
        '   Do something 
    End If

    コンパイルされませんが、代わりにコンパイラがエラーを発生させます:

    「is」演算子は、タイプ「整数」のオペランドを受け入れません。
    オペランドは参照型またはnull許容型である必要があります。

  2. IsNothing(object)は実際にはの一部ですMicrosoft.VisualBasic.dll
    VisualBasicライブラリへの不要な依存関係があるため、これは望ましくありません。

  3. その遅い-実際には33.76%遅い(1000000000回以上の反復)!

  4. おそらく個人的な好みですがIsNothing()ヨーダの状態のように読みます。変数を見るときは、その状態をチェックし、調査の対象にします。

    つまりはありません、それは Xを行いますか?--- しないですxのプロパティINGのそれを

    だから私はIf a IsNot Nothingより読みやすいと思いますIf Not IsNothing(a)


29

「何もない」に同意します。上記のように、「IsNot Nothing」で否定するのは簡単です。

これは読みやすいと思います...

If printDialog IsNot Nothing Then
    'blah
End If

これより...

If Not obj Is Nothing Then
    'blah
End If

5

VBは、「英語のように」、そして()や{}をよく使用する言語に慣れている人々にとって快適なものにするためのものです。たとえば、 "like english"側では、VBには " Ai n't "キーワードがあります...いいえ、冗談ではありません。そしてもう一方の面では、おそらくほとんどの場合すでに知っているので、必要に応じて()を関数呼び出しで使用できますが、そうする必要はありません。

私はIsNothing()を好みますが、私はCとC#を使用しているので、それが快適です。そして、私はそれがより読みやすいと思います。しかし、あなたにとってより快適に感じられるものなら何でもいい。


3
あなたのリンクは死んでいるので、ここでの価値は生きているものです:web.archive.org/web/20050308014055/http : //ea.3leaf.com/2004/08/…これは、一般的な考えに反して、違います。
Matt Wilko、2013年

5

主にそれがよりオブジェクト指向に見えるため、私は「Is Nothing」の代替案に傾いています。

確かにVisual Basic Ai n'tキーワードを持っていません。


VB.NETは拡張メソッドを実行できますか?:)
klkitchens 2009年


1

最初はIsNothingを使用していましたが、主に読みやすさの観点から、新しいプロジェクトではIs Nothingを使用するようにしています。IsNothingを使用するのは、コードがずっと使用されている場所でコードを維持していて、一貫性を保ちたい場合だけです。


-2

Is Nothingには、値Nothingに割り当てられたオブジェクトが必要です。IsNothing()は、数値型など、初期化されていない変数を使用できます。これは、たとえば、オプションのパラメーターが渡されたかどうかをテストする場合に役立ちます。


これは間違っています。あなたはそれを間違った方法で得ていないと確信していますか?" IsNothingは参照型で機能することを目的としています。値型はNothingの値を保持できず、Nothing [...] IsNothingを割り当てた場合、デフォルト値に戻ります。IsNothingは常にFalseを返します。" ただし、「任意のデータ型のデフォルト値を表します。[...]値型の場合、[これ]は値型がnull値を許容するかどうかによって異なります。」それで、良くないですか?Nothing Is Nothing
underscore_d
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.