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

时间:2012-02-10 18:41:37

标签: c# .net

我的代码如下

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

为什么会出现错误Use of unassigned local variable tmpCnt?我知道我没有明确地初始化它,但由于Default Value Table,值类型无论如何都用0初始化。该参考文献也提醒我:

  

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

但是,如果默认情况下已经完成,为什么我必须明确地执行此操作?如果我不必这样做,它会不会获得性能?只是想知道...

10 个答案:

答案 0 :(得分:107)

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

成员已初始化,例如:

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++;  

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

答案 1 :(得分:10)

默认分配适用于类成员,但不适用于局部变量。正如Eric Lippert在this answer中解释的那样,Microsoft 默认情况下可以初始化本地,但他们选择不这样做,因为使用未分配的本地几乎肯定是一个错误。

答案 2 :(得分:5)

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

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

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

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

答案 3 :(得分:1)

虽然值类型具有默认值且不能为null,但还需要显式初始化它们才能使用。您可以将这两个规则视为并排规则。 值类型不能为null ==>编译器保证这一点。 如果你问怎么样?你得到的错误信息就是答案。一旦调用了它们的构造函数,就会使用它们的默认值进行初始化。

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

答案 4 :(得分:1)

局部变量没有默认值。

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

答案 5 :(得分:0)

有关未初始化的bool,请参阅this thread,但它应该回答您的问题。

除非您调用其构造函数(new)或为其赋值,否则不会初始化局部变量。

答案 6 :(得分:0)

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

如果要初始化局部变量,则需要显式初始化局部变量。在这种情况下,(如链接文档所述)可以通过设置值0或使用new运算符。

您显示的代码确实尝试在将变量初始化为任何内容之前使用变量tmpCnt的值,并且编译器正确地警告它。

答案 7 :(得分:0)

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

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

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

在您的代码中,您只是定义了变量,但从未初始化对象。

答案 8 :(得分:0)

IEnumerable<DateTime?> _getCurrentHolidayList; //this will not initailize

在循环内分配值(_getCurrentHolidayList)

foreach (HolidaySummaryList _holidayItem in _holidayDetailsList)
{
                            if (_holidayItem.CountryId == Countryid)
                                _getCurrentHolidayList = _holidayItem.Holiday;                                                   
}

将本地变量传递给另一种方法后,如下所示。  抛出错误(使用未分配的变量)。即使在标度时提到了nullable。

var cancelRescheduleCondition = GetHolidayDays(_item.ServiceDateFrom, _getCurrentHolidayList);

如果您像下面这样提及,它将不会引发任何错误。

IEnumerable<DateTime?> _getCurrentHolidayList =null;

答案 9 :(得分:0)

一个非常虚假的错误,但是如果您没有实例化它,也可以通过一个类来解决。

BankAccount account;
account.addMoney(5);

以上内容将产生与以下内容相同的错误:

class BankAccount
{
    int balance = 0;
    public void addMoney(int amount)
    {
        balance += amount;
    }
}

执行以下操作以消除错误

BankAccount account = new BankAccount();
account.addMoney(5);