使用未分配的局部变量。 但总是落入任务
有这个代码,我不明白为什么如果在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-blockfinally
终于阻止
- try-block开头的
v
的明确赋值状态与stmt开头的v
的明确赋值状态相同。- finally块的开头的
v
的明确赋值状态与stmt开头的v
的明确赋值状态相同。- …
因此,对于您的特定示例,由于currency
未在try
块的开头明确赋值,因此它被认为在finally
块的开头没有明确赋值。
如果new CurrencyVO()
在catch
块中导致exception怎么办? A-HA!
您可以在不符合语言规范的情况下推理出来。 这里的失败模式是catch块中的语句可以抛出exception。 很可能,在C#中支持在构造函数中抛出exception。 但总的来说,任何语句都可以抛出exception。 这将使变量未初始化。 finally块中的赋值将始终执行。 在这种情况下使用未初始化的变量。
如果它完全相关的话,你需要考虑在这种情况下你会发生什么。 但显而易见的解决方法是简单地将变量初始化为null。
您正在catch块中创建一个新的CurrencyVO
对象:只有在出现错误/exception时才会执行该对象。 因此,如果您没有遇到任何exception: currency
变量将不会被分配。 这就是你不能使用它的原因。
编辑:对要编译的代码进行以下更改:
CurrencyVO currency = null;
最后:
if (currency != null) model.PublishedContainer.Currency = currency;
http://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/a994a0ff-432b-4d23-b7d2-838b0b961de0