为什么编译错误“使用未分配的本地变量”?

我的代码如下

int tmpCnt; if (name == "Dude") tmpCnt++; 

为什么会出现错误Use of unassigned local variable tmpCnt ? 我知道我没有明确地初始化它,但由于默认值表的值类型初始化0反正。 这个参考文件还提醒我:

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

但是为什么我必须明确地做,如果它已经默认完成? 如果我不这样做,它会不会得到表现? 就是想…

局部变量不被初始化。 你必须手动初始化它们。

成员初始化,例如:

 public class X { private int _tmpCnt; // This WILL initialize to zero ... } 

但局部变量不是:

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

所以你的代码必须是:

 int tmpCnt = 0; if (name == "Dude") tmpCnt++; 

所以这个长短不一,成员初始化,当地人不是。 这就是为什么你得到编译器错误。

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

以下类别的变量被分类为初始未分配

  • 最初未分配的结构体变量的实例变量。
  • 输出参数,包括结构实例构造函数的这个变量。
  • 局部变量,除了在catch子句或foreach语句中声明的变量。

以下类别的变量被分类为初始分配

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

局部变量不会自动初始化。 这只发生在实例级变量。

如果你想让它们初始化,你需要明确地初始化局部变量。 在这种情况下,(通过链接文档解释)通过设置值0或使用new操作符。

你已经显示的代码确实试图在变量tmpCnt被初始化为任何东西之前使用它的值,编译器会正确地提出警告。

你必须首先尝试像这样初始化int变量

 int tmpCnt = 0; if (name == "Dude") { tmpCnt++; } 

默认值表仅适用于初始化变量。

根据链接页面,以下两种初始化方法是等价的…

 int x = 0; int x = new int(); 

在你的代码中,你只是定义了变量,但从来没有初始化对象。

看到这个线程有关未初始化的布尔,但它应该回答你的问题。

局部变量不会被初始化,除非你调用它们的构造函数(new)或为它们赋值。

虽然值类型具有默认值,但不能为null,但它们也需要显式初始化才能使用。 你可以把这两条规则看成是并排的规则。 值类型不能为空==>编译器保证。 如果你问如何? 你得到的错误信息就是答案。 一旦你调用它们的构造函数,它们就会以默认值进行初始化。

 int tmpCnt; // not accepted int tmpCnt = new Int(); // defualt value applied tmpCnt = 0 

局部变量没有默认值。

在使用它们之前,必须明确指定它们。 它减少了使用一个你认为已经给出了合理价值的变量的机会,而实际上它有一些默认值。