有没有办法让visual studio忽略使用未分配对象的编译错误?

时间:2012-02-22 12:26:48

标签: c# visual-studio-2010

我的代码基本上看起来像这样(它实际上不是对象,而是自定义类):

object thing
try {
  thing = new object();
    ......

} catch { stuff }
finally {
  if (thing != null) { some clean up code }

VS 不允许我这样做,因为它说我引用了一个未分配的变量。我很清楚,在运行此代码时可能会取消分配,这就是为什么存在空检查的原因。我不想在 try 块之外实例化对象,因为它确实有点可以抛出异常,我宁愿不要将整个东西包装在另一个 try / catch中阻止,我可以在那里实例化它。还有什么我可以做的吗?

8 个答案:

答案 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 }