Cada vez que se crea un tipo en C#, automáticamente se rellena con ceros acolchados. En el caso de una clase (tipo de referencia), esto equivale a un puntero nulo. Así que, técnicamente, cada vez que se trabaja con las clases, los siguientes son idénticos:
MyClass class;
MyClass class2 = null;
Con los tipos de valor (de cualquier estructura, incluyendo int/float/double/etc), el tipo se pasa con ceros, por lo los siguientes son equivalentes:
int i;
int j = 0;
Sin embargo, en un método, el compilador comprueba para ver si ha asignado un valor a sus tipos antes de usarlo. Si lo hace lo siguiente, el compilador se quejará:
int i;
Console.WriteLine{"{0}",i);
Técnicamente, lo anterior debe estar bien - pero ya que es una fuente común de error del programador, el compilador comprueba específicamente para las variables locales no asignados, y se queja. Sin embargo, esta es una queja en tiempo de compilación, y no un problema de CLR. Puedes hacer IL que haga lo anterior, y funciona bien.
_Fields_ siempre se inicializan automáticamente al valor predeterminado del tipo de campo, que en el caso de int es cero. Los campos se consideran definitivamente asignados; puedes leer sus contenidos incluso antes de una tarea explícita. _Locales_ no se consideran definitivamente asignados; se requiere que haga algo que le asigna el valor de un local antes de que se lea su contenido. Consulte la sección "asignación definitiva" de la especificación C# para más detalles. –