133

ここに VB.NET を使用していて、 (たとえば、または) ではIsNothingなく、VB.NET を使用することを強く好む、または使用しないことを強く好む人はいますか? もしそうなら、なぜですか?Is NothingIf IsNothing(anObject)If anObject Is Nothing...

編集: どちらも同じように受け入れられると思う場合、どちらかを選んでそのままにしておくのが最善だと思いますか?

4

8 に答える 8

128

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

私が「Is Nothing」を使用する傾向がある理由は、それが「Not IsNothing(object)」ではなく「IsNot Nothing」になることを否定するときです。

于 2008-08-08T12:28:37.483 に答える
46

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

パトリック・スティールが彼のポストの功績を認められるようにするために、私は彼の答えをここにコピーしませんでした。しかし、Is NothingとIsNothingのどちらを使用するかを決定しようとしている場合は、彼の投稿を読む必要があると思います。IsNothingが最良の選択であることに同意していただけると思います。

編集-VoteCoffeのコメントはこちら

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

于 2008-08-11T14:12:57.020 に答える
35

使用は絶対に避けるべきIsNothing()

記事IsNothing() VS Is Nothingからの4 つの理由を次に示します。

  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' 演算子はタイプ 'Integer' のオペランドを受け入れません。
    オペランドは、参照型または null 許容型である必要があります。

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

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

  4. 個人的な好みかもしれませんが、 Yoda ConditionIsNothing()のように読めます。変数を見るときは、その変数を調査の対象として、その状態をチェックしています。

    つまり、それは x を行いますか? ---ないそれxのプロパティですか?

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

于 2014-06-30T16:07:10.720 に答える
29

私は「何もない」に同意します。前述のように、「IsNot Nothing」で簡単に否定できます。

こっちの方が読みやすいかな…

If printDialog IsNot Nothing Then
    'blah
End If

これより...

If Not obj Is Nothing Then
    'blah
End If
于 2008-08-08T13:11:51.640 に答える
4

VB は、() や {} を多用する言語に慣れている人にとって "英語のように" かつ快適にしようとする、そのようなものでいっぱいです。反対に、おそらくご存知のように、ほとんどの場合、必要に応じて関数呼び出しで () を使用できますが、そうする必要はありません。

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

于 2008-08-08T09:49:51.007 に答える
4

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

確かに、Visual BasicにAin't キーワードがありません。

于 2008-08-08T10:57:27.097 に答える
1

最初は IsNothing を使用していましたが、主に読みやすさのために、新しいプロジェクトでは Is Nothing を使用する方向に進んでいます。私が IsNothing に固執するのは、全体で使用されているコードを維持していて、一貫性を保ちたい場合だけです。

于 2008-08-08T13:24:51.097 に答える
-2

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

于 2016-03-06T04:23:28.023 に答える