I am curious what are the pros and cons of using if(some_value is DBNull)
versus if(DBNull.Value.Equals(some_value))
.
Personally i prefer if(some_value is DBNull)
because i find it more readable.
I know Microsoft recommends using if(DBNull.Value.Equals(some_value))
according to https://msdn.microsoft.com/en-us/library/system.dbnull%28v=vs.110%29.aspx.
I would go for the DBNull.Value.Equals
way.
Why?
Beacuse is
will check the type against equality. It has to look up the left hand type and match that against the right hand type which it also has to look up. After that it can compare the types, most likely by checking for reference equality.
That would be less efficient than just checking reference equality, which DBNull.Value.Equals
does. Since there is just once instance of DBNull.Value
, this check is very accurate and very fast.
==
or !=
is even better and faster :) –
Hawthorne Equals
if I am correct @IvanStoev Both check for reference equality. –
Paracelsus ReferenceEquals
, i.e. simple IL instruction. –
Hawthorne value is DBNull
actually checks whether value
is an instance of the DBNull
class, while value == DBNull.Value
actually performs a reference comparison between value
and the only instance of the singleton class DBNull
.
The value is DBNull
checks whether value
is an instance of DBNull
, which is only possible if value == DBNull.Value
, since DBNull
is a singleton.
The advantage of using value == DBNull.Value
is that it does a direct reference comparison which will be more efficient than determining the types for the is DBNull
comparison.
some_value is DbNull
: checks the type of some_value against type of DBNull
. This could be used if you could either instantiate an instance of DBNull
OR inherit from it. But no, this class has private constructors and is sealed.
DBNull.Value.Equals(some_value)
: checks value of some_value against the value represented by DBNull.Value
.
DBNull.Value
. So if the type is the same then the reference will also be the same. And of course if the references are equal then the types are too. –
Manicotti DBNull
is a singleton and DBNull.Value
is the only instance of DBNull
, value is DBNull
is only possible if value == DBNull.Value
and vice versa. –
Perigordian some_value
is an instance of DBNull
. And as DBNull
is a singleton with its sole instance DBNull.Value
, is DBNull
and == DBNull.Value
both do exactly the same thing in the end, but == DBNull.Value
does it more efficiently. –
Perigordian © 2022 - 2024 — McMap. All rights reserved.