CaubleStone Ink

.Net development and other geeky stuff

Effective use of Nullable

Posted on May 22nd, 2009


In this post I will give a quick usage scenario for using Nullable<T> as well as the nice shortcut of the null coalescing operator ??.

I know when I first ran into some code with this ?? thing in it I was like what the heck is that. Well it is something that every developer should know about. So what does it do? If you are working with objects or value types that can be null you can use this to guarantee that you have a value.

Simple example of how this works:

string test = null;
Console.WriteLine(test ?? "We had a null value");

What this will do is print “We had a null value” to the console. Now in .Net 2.0 they introduced Nullable<T> objects as well. The null coalescing operator can be used with these quite effectively as well.

Let’s look at a Date object and how we used to have to use it:

DateTime today = new DateTime();
if (today.Year == 1900)
{
   today = DateTime.Now;
}

In the old days we would have old date times out there instead of a nice null value. So with .net 2.0 we can now do something like this.

DateTime? today = null;
if (!today.HasValue)
{
   today = DateTime.Now;
}

Now that still looks like a lot of code. This is where the null coalescing operator comes into play. Take a look:

DateTime? today = null;
today = today ?? DateTime.Now;

What this does is allows us to say, hey, if the today variable is null set it to DateTime.Now. It is clean and concise.

Now you may be also asking what the ? is after the DateTime variable. Well this is shorthand for the Nullable<T> object. You could also define the same code like this and it would mean the exact same thing. I just find the ? easier to read.

Nullable<DateTime> today = null;
today = today ?? DateTime.Now;

As you can see not only are nullable objects handy but the null coalescing operator is even handier. So now you might ask can I use it on my own objects. The answer is YES you can use the ?? operator on anything that can be null. This gives this operator true versatility and should be in every developers playbook.