我的代码如下
int tmpCnt;
if (name == "Dude")
tmpCnt++;
为什么会出现错误"Use of unassigned local variable tmpCnt"?
我知道我没有显式初始化它,但由于默认值表格,值类型总是用
0
进行初始化。参考还提醒我:
但如果这已经默认完成了,为什么我还需要显式地执行它呢?如果我不这样做,会不会提高性能?请记住,在C#中使用未初始化的变量是不允许的。
我的代码如下
int tmpCnt;
if (name == "Dude")
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++;
简而言之,成员被初始化了,而局部变量没有被初始化。这就是为什么会出现编译器错误的原因。
out var 变量
语法也会出现这个警告,我认为这种情况很烦人。 - mkb默认赋值适用于类成员,但不适用于局部变量。正如 Eric Lippert 在 这个回答中所解释的那样,微软本来可以默认初始化局部变量的,但选择不这样做是因为使用未初始化的局部变量几乎肯定是一个错误。
本地变量没有默认值。
在使用之前必须明确赋值。这可以降低使用您认为已经赋予合理值的变量的机会,而实际上它具有一些默认值。
默认值表仅适用于变量的初始化。
根据链接页面,以下两种初始化方法是等效的...
int x = 0;
int x = new int();
BankAccount account;
account.addMoney(5);
class BankAccount
{
int balance = 0;
public void addMoney(int amount)
{
balance += amount;
}
}
按照以下步骤消除错误:
BankAccount account = new BankAccount();
account.addMoney(5);
虽然值类型具有默认值并且不能为 null,但它们也需要明确初始化才能使用。您可以将这两个规则视为并排规则。
值类型不能为 null - 编译器保证了这一点。 如果你想知道为什么,那么你得到的错误消息就是答案。一旦调用它们的构造函数,它们就会被初始化为它们的默认值。
int tmpCnt; // Not accepted
int tmpCnt = new Int(); // Default value applied tmpCnt = 0
本地变量不会自动初始化。这只会发生在实例级别的变量。
如果您想要初始化局部变量,您需要显式地进行初始化。在这种情况下(如链接文档所述),可以通过设置值为0或使用new
运算符来实现。
您展示的代码确实尝试在将变量tmpCnt
初始化为任何值之前使用它的值,编译器正确地发出了警告。
IEnumerable<DateTime?> _getCurrentHolidayList; //this will not initailize
foreach (HolidaySummaryList _holidayItem in _holidayDetailsList)
{
if (_holidayItem.CountryId == Countryid)
_getCurrentHolidayList = _holidayItem.Holiday;
}
当你像下面这样将本地变量传递给另一个方法时,它会抛出错误(使用未分配的变量),即使在声明时使用了可空类型。
var cancelRescheduleCondition = GetHolidayDays(_item.ServiceDateFrom, _getCurrentHolidayList);
如果你像下面这样提到,它不会抛出任何错误。
IEnumerable<DateTime?> _getCurrentHolidayList =null;