Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

.NET DBNull vs Nothing across all variable types?

I am a little confused about null values and variables in .NET. (VB preferred)

Is there any way to check the "nullness" of ANY given variable regardless of whether it was an object or a value type? Or does my null check have to always anticipate whether it's checking a value type (e.g. System.Integer) or an object?

I guess what I'm looking for is a function that checks all possible kind of null-ness. That is, any type of variables that

a) were never assigned a value since declared

b) were assigned a null value from a data object (that came from a database)

c) were set equals to another variable value which was null

d) were set to an ASP.NET session/application variable that was never set or expired.

Is there a general best-practice when it comes to handling null scenarios in .NET?

UPDATE: When I talk about a value type being "null", what I really mean is a value type that was either never set or was at some point set equal to or cast from a null object.

like image 452
Matias Nino Avatar asked Oct 02 '08 21:10

Matias Nino


People also ask

What is the difference between DBNull and null?

So, there's a big conceptual difference between the two. The keyword null represents an invalid reference. The class System. DbNull represents a nonexistent value in a database field.

Is DBNull or empty C#?

DBNull represents a nonexistent value returned from the database. In a database, for example, a column in a row of a table might not contain any data whatsoever. That is, the column is considered to not exist at all instead of merely not having a value. A DBNull object represents the nonexistent column.

What is DBNull in SQL?

DBNull is a singleton class, which means only this instance of this class can exist. If a database field has missing data, you can use the DBNull.

What is DBNull value in VB net?

DbNull is not the same as Nothing or an empty string. DbNull is used to denote the fact that a variable contains a missing or nonexistent value, and it is used primarily in the context of database field values. Since any expression that contains DbNull evaluates to DbNull , an expression such as: If var = DbNull Then.


3 Answers

Value Types can't be null. It violates what it means to be a Value Type. You can wrap Value Types as Nullable(Of T) which gives you a great set of methods, and checks for Nothing do work. But you do have a lot of overhead with that wrapper. Perhaps you can clarify what you're trying to do?

For completeness the VB syntax for Nullable wrappers is:

Dim i as Nullable(Of Integer) = Nothing '.NET 2.0/3.0'
Dim j as Integer? = Nothing '.NET 3.5'

EDIT: Value Type are always preinitialized to a default value, 0 for numerics, false for Booleans, etc.

like image 118
Bob King Avatar answered Sep 20 '22 14:09

Bob King


Normal value types (booleans, ints, longs, float, double, enum and structs) are not nullable.

The default value for all value types is 0.

The CLR won't let you access variables unless they have been set. You may think this isn't always the case, but sometimes the CLR steps in and initializes them for you. At a method level you must explicitly initialize all variables before they are used.

Further, as others point out, since .net 2.0 there is a new generic type called Nullable<T>. There are some compiler shorthands in C# like int? means Nullable<int>, double? means Nullable<double> etc.

You can only wrap Nullable<T> over non-nullable value types, which is fine since references already have the ability to be null.

int? x = null;

For an int?, while you can test against null, it's sometimes nicer to call x.HasValue().

In C# there's also the nullable coalescing operator ?? when you want to assign a nullable to a non-nullable value type. But if you don't have the operator, you can call GetValueOrDefault().

int y = x ?? 2; // y becomes 2 if x is null.
int z = x.GetValueOrDefault(2); // same as y
like image 33
Robert Paulson Avatar answered Sep 19 '22 14:09

Robert Paulson


Is this what you're after?

if IsNothing(foo) OrElse IsDbNull(foo) Then
    ' Do Something Because foo Is Either Nothing or DBNull.Value
End If

In truth I'm not certain why you'd wish for this structure. The Only time I'd check for DBNULL.Value is when I'm using values that came from a database, and before I assign said value from a DATA Namespace class to some other class [i.e. dim b as string = dataReader(0)].

Typically, if you're concerned about an object having not been instantiated, or needing it to be re-instantiated, then just an IsNothing check will suffice.

like image 44
Stephen Wrighton Avatar answered Sep 17 '22 14:09

Stephen Wrighton