List A The first List variable listA is initialized to a new empty List object. This variable does not have the value of null.
List B The second List variable listB is initialized to the null literal. No memory is allocated on the managed heap in this assignment.
List field This field is located in one place in memory. If you assign it in different places, the same reference will be changed.
// Field type List.
static List<int> _listField;
static void Main()
// Shows an empty List, not a null List.
//List<string> listA = new List<string>();
Console.WriteLine(listA == null);
// A null List reference.
//List<string> listB = null;
Console.WriteLine(listB == null);
// Calling an instance method on a null List causes a crash.
// Static Lists and field Lists are automatically null.
Console.WriteLine(_listField == null);
Console.WriteLine(default(List<bool>) == null);
TrueUnhandled Exception: System.NullReferenceException:
Object reference not set to an instance of an object.
List fields (and other reference types) are automatically treated as null references when they are loaded. You never need to initialize reference fields to null when you first encounter them.
Discussion. The book Refactoring by Martin Fowler contains a tutorial for replacing the null literal in a program with a "null object". This can simplify logic and reduce crashes.
Tip It makes sense to substitute a "dummy" object instance to stand in for cases where no data is available.
Summary. Lists that are fields in a class, either static or instance, are automatically initialized to null. Lists that are local variables are not initialized to null.