编译器错误 - "use of unassigned local variable"。会出什么问题?

Compiler error - "use of unassigned local variable". what can go wrong?

我读过的几乎所有博客都说编译器标记错误 "use of unassigned local variable" 说它的设计决定,因为历史表明未分配的变量是错误的来源,编译器想阻止你这样做。

我不确定分配给局部变量如何帮助我避免注入错误或什至减少引入错误的机会。

我可以将局部变量分配为某些方法的 return 值,该方法可能存在错误并最终导致错误分配。所以我不认为编译器在这个意义上帮助了我。如果设计者决定考虑未分配的局部变量的默认值,开发人员会处理它并且在 "possibly introducing bug" 的上下文中情况会相同,不是吗?

谢谢!!

想象一下,你有一个变量用来与另一个变量相乘,如果乘法发生时变量没有赋值,就会出错。这是编译器想要避免的,因为编译器不知道变量是否会在以后初始化。

使用未分配的变量可能是潜在的错误,也可能不是(几乎总是如此)。这里的问题是;如果它一个错误,您想什么时候知道?在编译时或 运行 相对难以发现代码是否足够复杂或引入的错误很微妙的时候?

一个简单的例子:

string Join(params object[] array)
{
    string foo;

    foreach (var o in arr)
        foo += o.ToString();
}

所以现在,我们有两个选择:编译器让你愉快地编译它并观察你在 运行 时间内崩溃和烧毁,或者它直接告诉你你有错误。后一种选择对我来说似乎更好。

现在,当您写这个问题时,您可能更多地考虑值类型而不是引用类型;未分配的引用类型实际上是立即数 NullReferenceException,尽管很麻烦,但一旦您第一次 运行 代码就很容易修复。

相反,值类型具有 可用 默认值,但这使情况变得更糟。现在,也许您忘记了将变量初始化为合理的值,并且在 运行 时间内没有明显的错误,但也许您只是在程序中引入了一个不太明显的错误:

int totalDays(DateTime date)
{
    DateTime now; //TODO: initialize to server time, not local DateTime.Now
    return (now - date).TotalDays;
}

写这段代码,你把咖啡洒了,然后你接到你妻子的 phone 电话,告诉你你的狗生病了,吐在你最喜欢的(也是昂贵的)地毯上,然后在去看兽医的路上又吐了在你崭新的车里……当你回来的时候,你已经忘记了 totalDays(我写完了,不是吗?)然后你开始处理你项目中的其他东西。在 day/week 结束时,您需要在最后期限前完成并在代码中发布错误。编译器可以 轻松地 警告您发生了一些有异味的事情。你到底为什么不想要它?

被说服了?