使用未赋值的局部变量.但总是落入任务

本文关键字:任务 局部变量 赋值 | 更新日期: 2023-09-27 18:18:28

有了这段代码,我不明白为什么如果在finally块中分配变量不理解它将永远被分配。我想我遗漏了一个有效的选项,即货币不会被分配。如果你知道,就很好理解为什么。非常感谢!

谢谢!

CurrencyVO currency;
try
{
     if (idConnection.HasValue && idConnection != 0)
     {
         currencyConnection = client.GetConnection(idConnection.Value);
         model.Connection = currencyConnection;
     }
     else 
     {
         int providerUserKey = (int)Models.UserModel.GetUser().ProviderUserKey;
         currencyConnection = client.GetConnection(providerUserKey);
     }                        
     currency = model.Currencies.SingleOrDefault(c => c.IdCountry == currencyConnection.idcountry) ?? new CurrencyVO();    
} 
catch
{
      currency = new CurrencyVO();                    
} 
finally
{
      model.PublishedContainer.Currency = currency;
}

错误发生在finally块上。如果我像这样把它从finally块中取出:

                } catch {
                    currency = new CurrencyVO();
                }
                model.PublishedContainer.Currency = currency;

使用未赋值的局部变量.但总是落入任务

c#编译器执行的确定赋值跟踪不一定执行完整的分析(在一般情况下这是不可能的)—有一些规则限制编译器执行的分析的复杂程度。这里涵盖finally块的规则记录在http://msdn.microsoft.com/en-us/library/aa691181.aspx:

对于try语句, stmt的格式为:

try try块 finally finally块

  • v试块开头的定赋状态与v开头的定赋状态相同stmt开头.
  • v末块开始处的定赋状态与v在处的定赋状态相同stmt的开头.

因此,对于您的特定示例,由于currency不是在try块的开始确定分配的,因此它被认为不是在finally块的开始确定分配的。

如果new CurrencyVO()catch块中导致异常怎么办?啊哈!

您可以在不触及语言规范的情况下推断出它。这里的失败模式是catch块中的语句可能抛出异常。很有可能,c#支持在构造函数中抛出异常。但在一般情况下,任何语句都可能抛出异常。这将使变量保持未初始化状态。finally块中的赋值将始终执行。在这种情况下使用未初始化的变量

你需要考虑在这种情况下你会发生什么,如果它是相关的。但是最明显的解决方法是简单地将变量初始化为null。

您正在catch块中创建一个新的CurrencyVO对象:它只会在出现错误/异常时执行。因此,如果没有遇到异常,则不会分配currency变量。这就是你不能用它的原因。

edit:为你的代码编译做以下修改:

CurrencyVO currency = null;

if (currency != null)
   model.PublishedContainer.Currency = currency;

http://social.msdn.microsoft.com/forums/en us/netfxbcl/thread/a994a0ff - 432 b - 4 - c15 - b7d2 - 838 b0b961de0