我的代码如下
int tmpCnt;
if (name == "Dude")
tmpCnt++;
为什么会出现错误Use of unassigned local variable tmpCnt
?我知道我没有明确地初始化它,但由于Default Value Table,值类型无论如何都用0
初始化。该参考文献也提醒我:
请记住,不允许在C#中使用未初始化的变量。
但是,如果默认情况下已经完成,为什么我必须明确地执行此操作?如果我不必这样做,它会不会获得性能?只是想知道...
答案 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)
以下类别的变量最初归类为未分配:
以下类别的变量分类为最初已分配:
答案 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);