I have always been wondering about why in the following example it is OK to not initialize the instance field (relying that it will have its default value) and accessing it, while local variables apparently must be initialized, even if I initialize it to default value it would get anyway…
public class TestClass
{
private bool a;
public void Do()
{
bool b; // That would solve the problem: = false;
Console.WriteLine(a);
Console.WriteLine(b); //Use of unassigned local variable 'b'
}
}
For local variables, the compiler has a good idea of the flow – it can see a “read” of the variable and a “write” of the variable, and prove (in most cases) that the first write will happen before the first read.
This isn’t the case with instance variables. Consider a simple property – how do you know if someone will set it before they get it? That makes it basically infeasible to enforce sensible rules – so either you’d have to ensure that all fields were set in the constructor, or allow them to have default values. The C# team chose the latter strategy.