ここに VB.NET を使用していて、 (たとえば、または) ではIsNothing
なく、VB.NET を使用することを強く好む、または使用しないことを強く好む人はいますか? もしそうなら、なぜですか?Is Nothing
If IsNothing(anObject)
If anObject Is Nothing...
編集: どちらも同じように受け入れられると思う場合、どちらかを選んでそのままにしておくのが最善だと思いますか?
実行中の MSIL を見ると、まったく同じコードにコンパイルされていないことがわかります。IsNothing() を使用すると、式を評価するだけでなく、実際にそのメソッドが呼び出されます。
私が「Is Nothing」を使用する傾向がある理由は、それが「Not IsNothing(object)」ではなく「IsNot Nothing」になることを否定するときです。
Patrick Steeleが彼のブログでこの質問に最もよく答えていることがわかりました: IsNothing()の回避
パトリック・スティールが彼のポストの功績を認められるようにするために、私は彼の答えをここにコピーしませんでした。しかし、Is NothingとIsNothingのどちらを使用するかを決定しようとしている場合は、彼の投稿を読む必要があると思います。IsNothingが最良の選択であることに同意していただけると思います。
編集-VoteCoffeのコメントはこちら
記事の一部の内容:さらにコードを確認した後、これを避ける必要がある別の理由を見つけました:値型を受け入れます!明らかに、IsNothing()は「オブジェクト」を受け入れる関数であるため、必要なものを何でも渡すことができます。値型の場合、.NETはそれをオブジェクトにボックス化し、IsNothingに渡します。ボックス化された値では常にfalseが返されます。VB.NETコンパイラは、「Is Nothing」スタイルの構文をチェックし、値の型に対して「IsNothing」を実行しようとしてもコンパイルされません。しかし、IsNothing()関数は文句なしにコンパイルされます。-PSteele –VoteCoffee
IsNothing()
記事IsNothing() VS Is Nothingからの4 つの理由を次に示します。
最も重要なの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 許容型である必要があります。
IsNothing(object)
実際には の一部の一部ですMicrosoft.VisualBasic.dll
。
VisualBasic ライブラリに不要な依存関係があるため、これは望ましくありません。
遅い - 実際には 33.76% 遅い (1000000000 以上の反復)!
個人的な好みかもしれませんが、 Yoda ConditionIsNothing()
のように読めます。変数を見るときは、その変数を調査の対象として、その状態をチェックしています。
つまり、それは x を行いますか? ---ないそれx
のプロパティですか?
だから私はIf a IsNot Nothing
よりよく読むと思いますIf Not IsNothing(a)
私は「何もない」に同意します。前述のように、「IsNot Nothing」で簡単に否定できます。
こっちの方が読みやすいかな…
If printDialog IsNot Nothing Then
'blah
End If
これより...
If Not obj Is Nothing Then
'blah
End If
VB は、() や {} を多用する言語に慣れている人にとって "英語のように" かつ快適にしようとする、そのようなものでいっぱいです。反対に、おそらくご存知のように、ほとんどの場合、必要に応じて関数呼び出しで () を使用できますが、そうする必要はありません。
私は IsNothing() の方が好きですが、C と C# を使用しているので、それが快適です。そして読みやすいと思います。しかし、あなたにとってより快適に感じるものに行きましょう。
主にオブジェクト指向のように見えるため、「Is Nothing」の代替案に傾いています。
確かに、Visual BasicにはAin't キーワードがありません。
最初は IsNothing を使用していましたが、主に読みやすさのために、新しいプロジェクトでは Is Nothing を使用する方向に進んでいます。私が IsNothing に固執するのは、全体で使用されているコードを維持していて、一貫性を保ちたい場合だけです。
Is Nothing には、値 Nothing に割り当てられたオブジェクトが必要です。IsNothing() は、数値型を含め、初期化されていない任意の変数を取ることができます。これは、オプションのパラメーターが渡されたかどうかをテストする場合などに役立ちます。