さっき、へーと思ったことがあったのでメモしときます。
通ることがプログラマに取って明らかである場合でも、コンパイラはそこまでは考えてくれないようです。そのため、以下のソースコードはコンパイル出来ません。
class Class1
{
public int Number { get; set; }
}
class Program
{
static void Main(string[] args)
{
Class1 c;
for (int i = 0; i < 100; i++)
{
if (i == 50) c = new Class1() { Number = 10 };
}
Console.WriteLine(c.Number); /* 未割り当てのローカル変数 ' c ' が使用されました。 */
}
}
これは、以下のソースコードで通るようなのです。
class Class1
{
public int Number { get; set; }
}
class Program
{
static void Main(string[] args)
{
Class1 c = null;
for (int i = 0; i < 100; i++)
{
if (i == 50) c = new Class1() { Number = 10 };
}
Console.WriteLine(c.Number); /* 未割り当てのローカル変数 ' c ' が使用されました。 */
}
}
実質何も変わってないのですが、nullを代入することによって、ある程度自己責任の上でインスタンスを生成し参照させますよ、ということを明示することになるんじゃないでしょうか。
null参照の危険性をコンパイル段階で教えてくれるのは非常にありがたい仕組みなので、お節介だと言うより、ここまでしてくれるのかといった気持ちのほうが大きいですね。普段はもちろん、こんなことをやらないほうが良いに決まっていますが、デフォルトで意味を持たない中身が空のインスタンスを生成しておくより幾分か精神安定にも良いので、うまく使いましょう。