可能重複:
Why do I have to assign a value to an int in C# when defaults to 0?我真的必須給我的所有變量初始值嗎?
我剛開始寫所謂的雜誌一個人爲的應用學習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;
}
}
}
不可以,但有效的代碼*必須*分配所有本地變量被訪問前值和編譯器*必須*保證這個的。我確信這是重複的。 – 2013-01-20 08:45:34
@pst:我如何保證編譯器的? – Hubro
這是編譯器確保在變量沒有值之前不使用變量的方法。編譯器無法從你複雜的條件語句中判斷出'currentEntryDate'在你使用它之前會有一個值,所以它會拋出錯誤。在這裏爲'currentEntryDate'賦予一個初始值如此悲劇? – JLRishe