为什么编译错误"使用未分配的局部变量"?

the*_*nut 62 .net c#

我的代码如下

int tmpCnt;  
if (name == "Dude")  
   tmpCnt++;  
Run Code Online (Sandbox Code Playgroud)

为什么会出错Use of unassigned local variable tmpCnt?我知道我没有明确初始化它,但由于默认值表,0无论如何都会初始化值类型.该参考文献也提醒我:

请记住,不允许在C#中使用未初始化的变量.

但是,如果它已经默认完成,为什么我必须明确地这样做?如果我不必这样做,它会不会获得性能?就是想...

Jam*_*are 119

局部变量未初始化.您必须手动初始化它们.

成员已初始化,例如:

public class X
{
    private int _tmpCnt; // This WILL initialize to zero
    ...
}
Run Code Online (Sandbox Code Playgroud)

但局部变量不是:

public static void SomeMethod()
{
    int tmpCnt;  // This is not initialized and must be assigned before used.

    ...
}
Run Code Online (Sandbox Code Playgroud)

所以你的代码必须是:

int tmpCnt = 0;  
if (name == "Dude")  
   tmpCnt++;  
Run Code Online (Sandbox Code Playgroud)

所以它的长期和短期是,成员被初始化,当地人不是.这就是你得到编译器错误的原因.

  • 谢谢!不知道会员和当地人的差异+1 (6认同)
  • 编译器功能,以避免错误.本地的内存(当然只是引用类型的引用)在声明中分配. (3认同)
  • @James:您是否知道这仅仅是防止这种错误的编译器功能,还是C#编译器实际上将已声明的本地对象的内存分配延迟到分配之前?(例如,在C ++中,使用未分配的变量是“确定”的,即使此类变量的值不可预测。) (2认同)
  • 避免什么错误? (2认同)

das*_*ght 12

默认分配适用于类成员,但不适用于局部变量.正如Eric Lippert在这个答案中解释的那样,微软可能默认初始化了本地人,但他们选择不这样做,因为使用未分配的本地几乎肯定是一个错误.


Joe*_*Joe 6

以下类别的变量被归类为最初未分配的变量:

  • 最初未分配的struct变量的实例变量.
  • 输出参数,包括struct实例构造函数的this变量.
  • 局部变量,但在catch子句或foreach语句中声明的变量除外.

以下类别的变量分类为最初分配的:

  • 静态变量.
  • 类实例的实例变量.
  • 最初分配的结构变量的实例变量.
  • 数组元素.
  • 值参数.
  • 参考参数.
  • 在catch子句或foreach语句中声明的变量.