VB.NET – IsNothing と Is Nothing
質問
ここにいる人は VB.NET を使用していて、使用することに対して強い好みを持っていますか? IsNothing
とは対照的に Is Nothing
(例えば、 If IsNothing(anObject)
または If anObject Is Nothing...
)?もしそうなら、なぜですか?
編集:どちらも同様に許容できると思う場合、どちらかを選択して使い続けるのが最善だと思いますか、それとも混合しても問題ないと思いますか?
解決
実行中の MSIL を見ると、まったく同じコードにコンパイルされていないことがわかります。IsNothing() を使用すると、単に式を評価するのではなく、実際にそのメソッドが呼び出されます。
私が "Is Nothing" を使用する傾向にある理由は、否定するときに "Not IsNothing(object)" ではなく "IsNot Nothing" になるためです。個人的には、その方が読みやすいと感じます。
他のヒント
それみつけたよ パトリック・スティール この質問に対する答えは彼のブログで最もよくわかりました。 IsNothing() の回避
パトリック・スティール氏の投稿の功績を確実にするために、ここでは彼の回答をコピーしませんでした。しかし、Is Nothing と IsNothing のどちらを使用するかを決めようとしている場合は、彼の投稿を読むべきだと思います。Is Nothing が最良の選択であることに同意していただけると思います。
編集 - VoteCoff のコメントはこちら
記事の内容の一部:さらにコードを見直した結果、これを避けるべき別の理由が見つかりました。値の型を受け入れます。明らかに、IsNothing() は「オブジェクト」を受け入れる関数なので、必要なものを何でも渡すことができます。それが値型の場合、.NET はそれをオブジェクトにボックス化して IsNothing に渡します。ボックス化された値に対しては常に false が返されます。VB.NET コンパイラは、「Is Nothing」スタイルの構文をチェックし、値型に対して「Is Nothing」を実行しようとするとコンパイルしません。しかし、IsNothing() 関数は問題なくコンパイルされます。-PSteele – VoteCoffee
使用は絶対に避けるべきです IsNothing()
ここにあります 4つの理由 記事から IsNothing() VS 何もない
最も重要なこと、
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 回以上の反復)。
個人的な好みかもしれませんが、
IsNothing()
のように読みます ヨーダ条件. 。変数を見るときは、それを調査の対象として、その状態をチェックしていることになります。つまりする それ ×をしますか?--- ない は
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 には、() と {} を頻繁に使用する言語に慣れている人々にとって、「英語らしく」快適なものにするための機能が満載です。たとえば、「英語のような」面では...VB には「そうじゃない「キーワード...冗談ではありません。その一方で、おそらくすでにご存知のとおり、必要に応じて関数呼び出しで () を使用できますが、そうする必要はありません。
私は IsNothing() の方が好きですが、C と C# を使用しているので、それが快適です。そして、より読みやすいと思います。ただし、自分にとってより快適だと感じるものを選んでください。
私は「Is Nothing」の代替案に傾いていますが、それは主に、そのほうがよりOOに見えるからです。
確かにVisual Basic そうじゃない Ain'tキーワードを取得しました。
また、私は SQL と同じくらい Is Nothing バージョンを部分的に使用する傾向があります。
私は最初は IsNothing を使用していましたが、主に読みやすさを考慮して、新しいプロジェクトでは Is Nothing を使用するようになりました。私が IsNothing にこだわるのは、コードが全体で使用され、一貫性を保ちたい場合に限ります。
Is Nothing には、値 Nothing が割り当てられたオブジェクトが必要です。IsNothing() は、数値型を含む、初期化されていない任意の変数を受け取ることができます。これは、オプションのパラメータが渡されたかどうかをテストする場合などに便利です。