我的代码如下
int tmpCnt;
if (name == "Dude")
tmpCnt++;
为什么会出现错误“使用未分配的局部变量tmpCnt”?
我知道我没有明确初始化它,但是由于默认值表,0无论如何都使用了一个值类型。该参考还提醒我:
请记住,不允许在C#中使用未初始化的变量。
但是,如果默认情况下已经完成,为什么还要显式执行呢?如果我不必这样做,它是否会获得性能?
我的代码如下
int tmpCnt;
if (name == "Dude")
tmpCnt++;
为什么会出现错误“使用未分配的局部变量tmpCnt”?
我知道我没有明确初始化它,但是由于默认值表,0无论如何都使用了一个值类型。该参考还提醒我:
请记住,不允许在C#中使用未初始化的变量。
但是,如果默认情况下已经完成,为什么还要显式执行呢?如果我不必这样做,它是否会获得性能?
Answers:
局部变量未初始化。您必须手动初始化它们。
成员被初始化,例如:
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)在此答案中解释的那样,默认情况下,Microsoft可以初始化本地人,但他们选择不这样做,因为使用未分配的本地人几乎可以肯定是一个错误。
局部变量没有默认值。
在使用它们之前,必须对它们进行明确分配。它减少了使用您认为已经赋予了合理值的变量的机会,而实际上却有了一些默认值。
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;
虽然值类型具有默认值,并且不能为null,但也需要对其进行显式初始化才能使用。您可以将这两个规则视为并排规则。
值类型不能为null→编译器保证。如果您问怎么做,您得到的错误消息就是答案。调用它们的构造函数后,便会使用默认值对其进行初始化。
int tmpCnt; // Not accepted
int tmpCnt = new Int(); // Default value applied tmpCnt = 0