Nullable types in C#
One of the "late breaking" features in C# 2.0 is what is known as "Nullable Types". The details can be found in the C# 2.0 language spec.
Nullable types address the scenario where you want to be able to have a primitive type with a null (or unknown) value. This is common in database scenarios, but is also useful in other situations.
In the past, there were several ways of doing this:
- A boxed value type. This is not strongly-typed at compile-time, and involves doing a heap allocation for every type.
- A class wrapper for the value type. This is strongly-typed, but still involves a heap allocation, and the you have to write the wrapper.
- A struct wrapper that supports the concept of nullability. This is a good solution, but you have to write it yourself.
To make this easier, in VS 2005, we're introducing a new type named "Nullable", that looks something like this (it's actually more complex than this, but I want to keep the example simple):
public bool HasValue;
public T Value;
You can use this struct directly, but we've also added some shortcut syntax to make the resulting code much cleaner. The first is the introduction of a new syntax for declaring a nullable type. Rather than typing:
I can write:
which is much simpler. Similarly, rather than needed to write a null test as:
you can use a familiar comparison to null:
Finally, we have support to make writing expressions easier. If I wanted to add two nullable ints together and preserve null values, if I didn't have language support, I would need to write:
Nullable<int> y = new Nullable<int>(33);
Nullable<int> z = (x.HasValue && y.HasValue) ?
new Nullable<int>(x.Value + y.Value) : Nullable<int>.NullValue
At least I think that's what I'd have to write - it's complex enough that I'm not sure this code works. This is ugly enough that it makes using Nullable without compiler support a whole lot of work. With the compiler support, you write:
int? y = 33;
int? z = x + y;