Click here to Skip to main content
12,891,744 members (52,141 online)
Click here to Skip to main content
Add your own
alternative version


24 bookmarked
Posted 28 Sep 2007

The Null Coalescing Operator (??)

, 28 Sep 2007 CPOL
Rate this:
Please Sign up or sign in to vote.
One of the most useful yet little-known features to come out of C# 2.0


I'm constantly surprised by the number of developers who aren't aware of this handy piece of syntax. It's my favourite thing to come out of C# 2.0 and no developer should be without it.

Like the conditional (?:) operator's big brother... introducing it for your coding pleasure...

The Null Coalescing Operator (??)

The null-coalescing-operator is a brilliant new terse operator that provides syntax for beautifully concise if statements. Essentially, it returns the left-hand-side of the ?? operator, unless null, in which case it executes and returns the right-hand-side of the operator. This may be a statement or a variable reference. Let's jump straight to some examples:

// used inline outputs the value foo or if null returns Undefined
Console.WriteLine("The value of foo is " + (foo ?? "Undefined") + ".");
Input:  foo = "24";
Output: The value of foo is 24.
Input:  foo = null;
Output: The value of foo is Undefined.

The operator is right-associative meaning statements can be chained together; thus returning the first non-null instance:

// assigns foo to the first non-null instance, else returns Undefined
string foo = foo1 ?? foo2 ?? foo3 ?? foo4 ?? "Undefined";
Console.WriteLine("The value of foo is " + foo + ".");

Input:  foo1 = null;
        foo2 = null;
        foo3 = null;
        foo4 = null;
Output: The value of foo is Undefined.
Input:  foo1 = null;
        foo2 = "foo2";
        foo3 = null;
        foo4 = "foo4";
Output: The value of foo is foo2.

Handling null ViewState references:

// try to assign ViewState value as an int, else if null assign 123
int foo = (int?)ViewState["foo"] ?? 123;
Response.Write("The value of foo is " + foo + ".");
Input:  ViewState["foo"]=1;
Output:  The value of foo is 1.  
Input:  ViewState["foo"]=null;
Output:  The value of foo is 123.  

And my personal favorite, on demand field instantiation:

private IList<string> foo;

public IList<string> Foo
        return foo ?? (foo = new List<string>());

Here's an interesting example derived from an idea in the discussions below. It shows how an operator override can be used within an object's definition to enable shorthand syntax for double-null checking. The scenario is checking an object property for null using a null-coalescing-operator, but also defaulting when null-object-reference occurs; which would normally cause a runtime exception. (Note that I don't recommend actually using this approach, I just thought it made an interesting example.)

public class Address
    private static Address Empty = new Address();
    public string StreetName = null;
    public static Address operator +(Address address)
        return address ?? Empty
Console.WriteLine("The street name is "+ (+address).StreetName ?? "n/a" + ".");
Input:  address = new Address();
Output:  The street name is n/a.  
Input:  address = new Address();
            address.StreetName = "Regent St";
Output:  The street name is Regent St.    
Input:  address = null;
Output:  The street name is n/a.

The Rules

To use the null-coalescing-operator, there are some compile-time ground rules.

  • The left-hand-side must evaluate to a reference or nullable type.
  • All evaluated statements must be of matching type, unless they can be implicitly converted.


As you can see from the examples above, this little gem is very powerful and the possibilities are endless. Of course the benefits are purely syntactical, but it helps keep the code clean and easier to follow. I hope you enjoy it as much as I do.


  • 28th September, 2007: Initial post


This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


About the Author

United Kingdom United Kingdom
Mike Carlisle - Technical Architect with over 20 years experience in a wide range of technologies.


You may also be interested in...

Comments and Discussions

GeneralAn alternate view Pin
Big Al 071-Oct-07 6:38
memberBig Al 071-Oct-07 6:38 
Whilst I respect your opinion, I would like to put forward an alternate point of view. I’m expecting a barrage of abuse here… but someone has to question it …

Why is a “new terse operator that provides syntax for beautifully concise if statements.” a good thing? I’ve coded in assembler for about half a dozen different processors and probably twice that many languages, and this is the sort of thing I would like to get away from, especially when inheriting someone else’s code. The purpose of a compiled language is (amongst other things) to increase legibility, maintainability; reduce errors and provide a greater degree of abstraction from the real processor. Not to make things more “terse”. If I want terse, then I’ll go back to assembler. I am quite prepared to go terse to get performance, but don't want it in a high level language.

I could come up with a language that uses "#Variable{…}" which means repeat until variable is 0… or other symbol combinations to remove the need for other language elements like if, while, for and foreach. Would these all be good things?

If this line of reasoning is followed to its conclusion, then code will more resemble hieroglyphics which needs decoding than something understandable by simply reading it.

I know this is a trivial case, but it is the view of it being taken as read as a good thing that bothers me. I would quite happily type 6 or 7 more characters to make things more readable for others (or myself) later, and many environments these days help cut down typing time finger strain if that's the worry.

GeneralRe: An alternate view Pin
TheCodeKing1-Oct-07 8:18
memberTheCodeKing1-Oct-07 8:18 
GeneralRe: An alternate view Pin
Hal Angseesing1-Oct-07 9:06
memberHal Angseesing1-Oct-07 9:06 
GeneralRe: An alternate view Pin
Big Al 071-Oct-07 14:47
memberBig Al 071-Oct-07 14:47 
GeneralRe: An alternate view Pin
kschulz1-Oct-07 12:08
memberkschulz1-Oct-07 12:08 
GeneralRe: An alternate view Pin
Matware1-Oct-07 16:24
memberMatware1-Oct-07 16:24 
GeneralRe: An alternate view Pin
greenblob3-Oct-07 5:12
membergreenblob3-Oct-07 5:12 
GeneralRe: An alternate view Pin
reinux18-Oct-07 19:06
memberreinux18-Oct-07 19:06 
GeneralRe: An alternate view Pin
peterchen5-Jan-08 10:25
memberpeterchen5-Jan-08 10:25 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Terms of Use | Mobile
Web01 | 2.8.170424.1 | Last Updated 28 Sep 2007
Article Copyright 2007 by TheCodeKing
Everything else Copyright © CodeProject, 1999-2017
Layout: fixed | fluid