Basically local variables aren't automatically initialized. Hence using them without initializing would result in an exception.
Only the following variables are automatically initialized to their default values:
- Static variables
- Instance variables of class and struct instances
- Array elements
The default values are as follows (assigned in default constructor of a class):
- The default value of a variable of reference type is null.
- For integer types, the default value is 0
- For char, the default value is `\u0000'
- For float, the default value is 0.0f
- For double, the default value is 0.0d
- For decimal, the default value is 0.0m
- For bool, the default value is false
- For an enum type, the default value is 0
- For a struct type, the default value is obtained by setting all value type fields to their default values
As far as later parts of your question are conerned:
- The reason why all variables which are not automatically initialized to default values should be initialized is a restriction imposed by compiler.
- private bool foo = false; This is indeed redundant since this is an instance variable of a class. Hence this would be initialized to false in the default constructor. Hence no need to set this to false yourself.