为啥在这里允许使用未分配的局部变量?

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 相当于在没有tryfinally 的情况下执行相同的代码。换句话说,你应该把这个问题放在“现实”的背景下。如果你添加catch,因为它“应该”是......那么编译器将抱怨可能的未分配变量。 @JohnG 我不同意你的断言,即没有catchtry 是没有意义的。在某些情况下,您可以将tryfinally 一起使用,因为在这些情况下,无论try 是否成功,确保发生某些事情是您想要做的,而不是处理错误本身。 @Llama...感谢您提供示例链接。我会在一定程度上同意您的说法,并且在您链接到的示例中是的,它清楚地表明我的假设“两个”部分都将执行被证明是错误的,因为示例表明“没有”try 和 @ 987654338@ 子句,那么最终代码将永远不会被执行。感谢您为我澄清这一点。我想我的方式已经老了,永远不会在没有捕获的情况下尝试尝试。生活和学习……谢谢。 【参考方案1】:

示例中的异常未被Main() 捕获。因此,如果抛出异常,则finally块后面的代码是不可达的,如果没有抛出异常,就会发生赋值。这就是为什么在任何情况下都不能使用未分配的变量。而且由于它不可能发生,编译器不会报告它。

【讨论】:

确实如此。 myVar = Throw(); 要么成功实例化 myVar,要么抛出异常。在后一种情况下,将永远无法到达myVar.Equals 我认为它与代码路径/堆栈/跳转有关。如果您将catch 添加到 try 函数,那么它会给您未使用的变量错误,因为可能会发生空值。

以上是关于为啥在这里允许使用未分配的局部变量?的主要内容,如果未能解决你的问题,请参考以下文章

为啥此 C# 代码会引发错误:使用未分配的局部变量 'n'

C语言中使用变量为啥必须要初始化?

“使用未分配的局部变量”错误的原因是啥? [复制]

统一使用未分配的局部变量(CS0165)光线投射[重复]

为啥在函数和类中处理未绑定的局部变量有区别?

C#未分配的局部变量错误