使用未赋值的局部变量.但总是落入任务
本文关键字:任务 局部变量 赋值 | 更新日期: 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