为啥在这里允许使用未分配的局部变量?
Posted
技术标签:
【中文标题】为啥在这里允许使用未分配的局部变量?【英文标题】:Why is Use of an unassigned local variable allowed here?为什么在这里允许使用未分配的局部变量? 【发布时间】:2022-01-19 03:30:51 【问题描述】:通常编译器禁止使用未分配的局部变量,但在以下情况下不会。为什么?
private void Main()
// This local variable is unassigned.
string myVar;
try
// The Throw() method prevents the assignment from happening...
myVar = Throw();
finally
// ... so myVar is still unassigned.
// Here we use myVar, which is unassigned, and the compiler is not complaining.
if (myVar.Equals("Something"))
// ...
private string Throw()
throw new Exception();
【问题讨论】:
除了答案之外,您可能会注意到使用try
而不使用catch
是没有意义的。从技术上讲,只有finally
子句的try
相当于在没有try
或finally
的情况下执行相同的代码。换句话说,你应该把这个问题放在“现实”的背景下。如果你添加catch
,因为它“应该”是......那么编译器将抱怨可能的未分配变量。
@JohnG 我不同意你的断言,即没有catch
的try
是没有意义的。在某些情况下,您可以将try
与finally
一起使用,因为在这些情况下,无论try
是否成功,确保发生某些事情是您想要做的,而不是处理错误本身。
@Llama...感谢您提供示例链接。我会在一定程度上同意您的说法,并且在您链接到的示例中是的,它清楚地表明我的假设“两个”部分都将执行被证明是错误的,因为示例表明“没有”try
和 @ 987654338@ 子句,那么最终代码将永远不会被执行。感谢您为我澄清这一点。我想我的方式已经老了,永远不会在没有捕获的情况下尝试尝试。生活和学习……谢谢。
【参考方案1】:
示例中的异常未被Main()
捕获。因此,如果抛出异常,则finally
块后面的代码是不可达的,如果没有抛出异常,就会发生赋值。这就是为什么在任何情况下都不能使用未分配的变量。而且由于它不可能发生,编译器不会报告它。
【讨论】:
确实如此。myVar = Throw();
要么成功实例化 myVar
,要么抛出异常。在后一种情况下,将永远无法到达myVar.Equals
。
我认为它与代码路径/堆栈/跳转有关。如果您将catch
添加到 try 函数,那么它会给您未使用的变量错误,因为可能会发生空值。以上是关于为啥在这里允许使用未分配的局部变量?的主要内容,如果未能解决你的问题,请参考以下文章