IsNothing versus Is Nothing
Solution 1
If you take a look at the MSIL as it's being executed you'll see that it doesn't compile down to the exact same code. When you use IsNothing() it actually makes a call to that method as opposed to just evaluating the expression.
The reason I would tend to lean towards using "Is Nothing" is when I'm negating it becomes "IsNot Nothing' rather than "Not IsNothing(object)" which I personally feel looks more readable.
Solution 2
I find that Patrick Steele answered this question best on his blog: Avoiding IsNothing()
I did not copy any of his answer here, to ensure Patrick Steele get's credit for his post. But I do think if you're trying to decide whether to use Is Nothing or IsNothing you should read his post. I think you'll agree that Is Nothing is the best choice.
Edit - VoteCoffe's comment here
Partial article contents: After reviewing more code I found out another reason you should avoid this: It accepts value types! Obviously, since IsNothing() is a function that accepts an 'object', you can pass anything you want to it. If it's a value type, .NET will box it up into an object and pass it to IsNothing -- which will always return false on a boxed value! The VB.NET compiler will check the "Is Nothing" style syntax and won't compile if you attempt to do an "Is Nothing" on a value type. But the IsNothing() function compiles without complaints. -PSteele – VoteCoffee
Solution 3
You should absolutely avoid using IsNothing()
Here are 4 reasons from the article IsNothing() VS Is Nothing
-
Most importantly,
IsNothing(object)
has everything passed to it as an object, even value types! Since value types cannot beNothing
, it’s a completely wasted check.
Take the following example:Dim i As Integer If IsNothing(i) Then ' Do something End If
This will compile and run fine, whereas this:
Dim i As Integer If i Is Nothing Then ' Do something End If
Will not compile, instead the compiler will raise the error:
'Is' operator does not accept operands of type 'Integer'.
Operands must be reference or nullable types. -
IsNothing(object)
is actually part of part of theMicrosoft.VisualBasic.dll
.
This is undesirable as you have an unneeded dependency on the VisualBasic library. -
Its slow - 33.76% slower in fact (over 1000000000 iterations)!
-
Perhaps personal preference, but
IsNothing()
reads like a Yoda Condition. When you look at a variable you're checking its state, with it as the subject of your investigation.i.e. does it do x? --- NOT Is
x
ing a property of it?So I think
If a IsNot Nothing
reads better thanIf Not IsNothing(a)
Solution 4
I agree with "Is Nothing". As stated above, it's easy to negate with "IsNot Nothing".
I find this easier to read...
If printDialog IsNot Nothing Then
'blah
End If
than this...
If Not obj Is Nothing Then
'blah
End If
Solution 5
I'm leaning towards the "Is Nothing" alternative, primarily because it seems more OO.
Surely Visual Basic ain't got the Ain't keyword.
Luke Girvin
Web developer (C#, JavaScript, SQL Server, Oracle), Emacs user, and Norwich City fan.
Updated on August 24, 2022Comments
-
Luke Girvin almost 2 years
Does anyone here use VB.NET and have a strong preference for or against using
IsNothing
as opposed toIs Nothing
(for example,If IsNothing(anObject)
orIf anObject Is Nothing...
)? If so, why?EDIT: If you think they're both equally acceptable, do you think it's best to pick one and stick with it, or is it OK to mix them?
-
klkitchens over 15 yearsCan VB.NET do extension methods? :)
-
VoteCoffee about 10 yearsPartial article contents: After reviewing more code I found out another reason you should avoid this: It accepts value types! Obviously, since IsNothing() is a function that accepts an 'object', you can pass anything you want to it. If it's a value type, .NET will box it up into an object and pass it to IsNothing -- which will always return false on a boxed value! The VB.NET compiler will check the "Is Nothing" style syntax and won't compile if you attempt to do an "Is Nothing" on a value type. But the IsNothing() function compiles without complaints. -PSteele
-
VoteCoffee about 10 yearsPosted some of the contents as you never know if the link will become dead and I thought it added a good point to the coversation.
-
underscore_d over 6 yearsThis is wrong. Are you sure you didn't get it the wrong way round? "IsNothing is intended to work on reference types. A value type cannot hold a value of Nothing and reverts to its default value if you assign Nothing [...] IsNothing always returns False." But
Nothing
"Represents the default value of any data type. [...] For value types, [this] depends on whether the value type is nullable." So isn'tIs Nothing
better?