我真的必须给我所有的变量一个初始值吗
本文关键字:一个 变量 真的 | 更新日期: 2023-09-27 17:54:59
可能重复:
当默认值为0时,为什么我必须在C#中为int赋值?
我刚开始通过编写一个名为Journal的人工应用程序来学习C#。在解析日志文件的函数中,我声明了变量DateTime currentEntryDate
。在我到达定义新条目的行之前,它不会得到值。当我到达条目行的第二次时,该变量将用于为上一个条目创建JournalEntry
类的实例。
问题是,使用变量的代码无法编译:
使用未分配的本地变量"currentEntryDate">
这对我来说毫无意义。为了让编译器满意,我真的必须给变量一个浪费的初始值吗?我肯定误解了什么,或者我的代码中有错误。
Pastebin上的代码:Journal.cs。我已经突出显示了相关的行。
代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;
namespace Journal
{
class Journal
{
public List<JournalEntry> Entries;
private static readonly string EntryLineRegex =
@"-- Entry: (?<title>.*) '((?<year>'d{4})-(?<month>'d{2})" +
@"-(?<day>'d{2})')";
public static Journal FromFile(string filePath)
{
Journal returnValue = new Journal();
StreamReader fileReader = new StreamReader(filePath);
// Prepare variables for parsing the journal file.
bool hitFirstEntry = false;
DateTime currentEntryDate;
string currentEntryTitle;
StringBuilder currentEntryText = new StringBuilder();
// Prepare a regular expression for the entry lines.
Regex entryLineRegex = new Regex(EntryLineRegex);
while (!fileReader.EndOfStream)
{
string line = fileReader.ReadLine();
if (line.StartsWith("--"))
{
// Is this the first entry encountered? If so, don't try to
// process the previous entry.
if (!hitFirstEntry)
{
hitFirstEntry = true;
}
else
{
// Create a JournalEntry with the current entry, then
// reset for the next entry.
returnValue.Entries.Add(
new JournalEntry(
currentEntryText.ToString(), currentEntryDate
)
);
currentEntryDate = new DateTime();
currentEntryText.Clear();
}
// Extract the new entry title and date from this line and
// save them.
Match entryMatch = entryLineRegex.Match(line);
GroupCollection matches = entryMatch.Groups;
currentEntryDate = new DateTime(
Convert.ToInt16(matches["year"].Value),
Convert.ToInt16(matches["month"].Value),
Convert.ToInt16(matches["day"].Value)
);
currentEntryTitle = matches["title"].Value;
}
else
{
currentEntryText.Append(line);
}
}
return returnValue;
}
}
class JournalEntry
{
public string Text;
public DateTime EntryDate;
public JournalEntry(string text, DateTime entryDate)
{
this.Text = text;
this.EntryDate = entryDate;
}
}
}
这样重组循环怎么样?这将确保currentEntryDate
在使用之前有一个值:
string line = fileReader.ReadLine();
while (line != null)
{
// Extract the new entry title and date from this line and
// save them.
Match entryMatch = entryLineRegex.Match(line);
GroupCollection matches = entryMatch.Groups;
currentEntryDate = new DateTime(
Convert.ToInt16(matches["year"].Value),
Convert.ToInt16(matches["month"].Value),
Convert.ToInt16(matches["day"].Value)
);
currentEntryTitle = matches["title"].Value;
while ((line = fileReader.ReadLine()) != null && !line.StartsWith("--"))
{
currentEntryText.Append(line);
}
// Create a JournalEntry with the current entry, then
// reset for the next entry.
returnValue.Entries.Add(
new JournalEntry(
currentEntryText.ToString(), currentEntryDate
)
);
currentEntryText.Clear();
}
我认为这里的问题是编译器不够聪明,无法掌握读取输入的方式,并且有一条执行路径不会初始化变量,即如果它先经过else
,然后再经过if
。为了避免这种情况,您可能需要在定义时进行初始化。
在这种情况下,编译器没有实现hitFirstEntry
和currentEntryDate
之间的"依赖性"。
即使您可以"证明"每当hitFirstEntry
更改为true
时,currentEntryDate
将在那之后不久被分配,并且currentEntryDate
不会第一次被读取,直到(最早(在循环的下一次迭代中,编译器并不是复杂的。也许你可以重写你的代码。
编辑:以下是您代码的"最低"版本:
bool isFirstTime = true;
DateTime localVarToBeAssigned;
while (true)
{
if (isFirstTime)
{
isFirstTime = false;
}
else
{
// this reads the variable
Console.WriteLine(localVarToBeAssigned);
}
// this assigns the variable
localVarToBeAssigned = DateTime.Now;
}
如果你真的,真的不想实例化它:
DateTime? currentEntryDate = null
问号使DateTime可以为null,而它通常不是。
您声明局部变量这些变量没有默认值,并从堆栈中获取内存在使用局部变量之前,应该先初始化它们带有此代码的变更行:
currentEntryDate=新日期时间((;
太高的行您的代码将工作,