is DBNull vs. DBNull.Value.Equals()
Asked Answered
M

3

7

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.

Moxie answered 14/7, 2016 at 12:6 Comment(1)
it is not duplicate, this question is different than that oneCornetcy
P
3

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.

Paracelsus answered 14/7, 2016 at 12:17 Comment(4)
And using == or != is even better and faster :)Hawthorne
Which would be the same as Equals if I am correct @IvanStoev Both check for reference equality.Paracelsus
Well, not exacly. It will be ReferenceEquals, i.e. simple IL instruction.Hawthorne
Aside from performance are there any differences in the result of the two operations? I understand they are very different, but i could not think of an example when they give different results, since DBNull is sealed.Moxie
P
2

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.

Perigordian answered 14/7, 2016 at 12:14 Comment(0)
T
0

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.

Trying answered 14/7, 2016 at 12:10 Comment(8)
No pros and cons. Both compare totally different things - type in one case and value in the other. Horses for courses....Trying
In general, you are right. But in the DbNull case the result is the same: DbNull.Value is the only possible value of type DbNull.Morelock
Can you elaborate how the results is same? Both compare two different things - one compares type and other the value.Trying
@VijayGill It's a Singleton, so there is only one instance of that type 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
@VijayGill Since 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
On what basis is it assumed that "some_value" in this question is an instance of DBNull?Trying
@VijayGill That's not the assumption. It is the question. You want to find out whether 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
@ThorstenDittmar - that I understand, I just got caught-up in my assumption that "some_value" could be anything. Thanks for clearing it out.Trying

© 2022 - 2024 — McMap. All rights reserved.