我的代码基本上看起来像这样(它实际上不是对象,而是自定义类):
object thing
try {
thing = new object();
......
} catch { stuff }
finally {
if (thing != null) { some clean up code }
但 VS 不允许我这样做,因为它说我引用了一个未分配的变量。我很清楚,在运行此代码时可能会取消分配,这就是为什么存在空检查的原因。我不想在 try 块之外实例化对象,因为它确实有点可以抛出异常,我宁愿不要将整个东西包装在另一个 try / catch中阻止,我可以在那里实例化它。还有什么我可以做的吗?
答案 0 :(得分:11)
“未分配”与“null”不同。您的代码无效 - 您需要修复它。
这里很容易 - 只需将变量初始化为null
即可:
object thing = null;
现在它肯定会有一个值(一个空引用),所以你可以在finally
块中读取它。
关键是在编译器可以证明某个值(无论是否为空)已明确分配的点之前,无法读取局部变量 。实际上,局部变量没有“默认值”。
(请注意,我通常会使用IDisposable
清除代码以及using
语句。)
答案 1 :(得分:6)
不,您无法禁用该编译器错误。但是你为什么不只是初始化变量?
object thing = null;
与字段不同,局部变量不会自动初始化为null
。它们是未初始化的,这是一种特殊的状态,与null
不同。
答案 2 :(得分:4)
只做
object thing = null;
并且编译器将被安抚。
有关编译器抱怨此问题的背景信息,请参阅this Eric Lippert answer,其中:
这在C#中是非法的原因是因为使用未分配的本地很可能是一个错误。
答案 3 :(得分:2)
怎么样:
object thing = null;
答案 4 :(得分:1)
最初设置为null有什么问题?
object thing = null;
try {
thing = new object();
......
} catch { stuff }
finally {
if (thing != null) { some clean up code }
答案 5 :(得分:1)
只需指定null即可:
object thing = null; // <-- That's assignment enough
try {
thing = new object();
......
} catch { stuff }
finally {
if (thing != null) { some clean up code }
}
答案 6 :(得分:1)
为什么不尝试object thing = null;作为第一线?
答案 7 :(得分:1)
将您的代码更改为此代码,它应该可以正常工作
object thing = null;
try {
thing = new object();
......
} catch { stuff }
finally {
if (thing != null) { some clean up code }