C#: Nullable Types and ?? Operator
Nullable types vs Non-nullable types
While developing C# projects it is common to perform null comparison operation in order to avoid null exceptions. This simple operation is mainly coded using the “var x = null” code example inside of an if clause. However not all types of variables are nullable, which means that setting a variable to null is not allowed in every case, it depends on what kind of variable you are defining. But what if there was an extension to your non-nullable type that would convert your variable types to nullable? This extension really exists.
As I said before in C# you have nullable types which represent all the values of an underlying type, and an additional null value and can be declared easily using “T?”, where T is the type of the variable and for example the normal int type cannot be null, so it is a non-nullable type, however if you define a “int?” your variable can be null, what you do is convert a non-nullable type to a nullable type.
Example:
int x=null; Not allowed
http://rpmachado.files.wordpress.com/2012/10/image_thumb.png?w=719&h=158
int? x=null; Allowed
http://rpmachado.files.wordpress.com/2012/10/image_thumb1.png?w=558&h=192
While using nullable types you can check if a variable is null the same way you do it with non-nullable types and a constant:
http://rpmachado.files.wordpress.com/2012/10/image_thumb2.png?w=816&h=336
What about Setting a Default Value when a certain variable is null?
In this case the C# .net framework lets you set a default value when you try to assign a nullable type to a non-nullable type, using the ?? operator.
If you don’t use this operator you can still catch the InvalidOperationException which is thrown in these cases.
For example without the ?? operator :
http://rpmachado.files.wordpress.com/2012/10/image_thumb3.png?w=719&h=387
Using the ?? operator your code becomes cleaner and more easy to read and you get a bonus, you can set a default value for multiple variables using the ?? in a chain set.
http://rpmachado.files.wordpress.com/2012/10/image_thumb4.png?w=719&h=362
Nullable types vs Nullable fields
There is another interesting case of working with DataSet and DataRow when fields can be nullable. Recently I had this problem myself:
I had written this code:
start_time = Convert.ToDateTime((row["start_time"] ?? DTSqlMinDate));
And got this exception in run-time:
"Object cannot be cast from DBNull to other types".
So, there is very important distinction between null and nullable fields (columns) in the database. In the latter case they have DbNull.Value.
I wrote this code first to fix the problem:
Convert.ToDateTime((row["start_time"]== DBNull.Value)?DTSqlMinDate:row["start_time"]);
However, this is too complicated. Rob Jasinski from UniversalThread suggested much better alternative:
start_time = row.Field<DateTime?>("start_time") ?? DTSqlMinDate;
I am now often using this syntax instead of more complicated Convert syntax when I am working with DataRow.