我在创建HighScores对象时尝试写入文件。我尝试使用Name和Score属性作为文件的文本,但即使我初始化了对象,它们似乎也分别为null和0。所以我的问题是为什么不写#34;大卫:88"?
static void Main(string[] args)
{
HighScores David = new HighScores() { Name = "David", Score = 88 };
}
class HighScores
{
public string Name { get; set; }
private int score;
public int Score
{
get
{
if (score < 50)
{
return 0;
}
return score;
}
set
{
score = value;
}
}
public HighScores()
{
// Opening and writing to the file
FileStream fileStream = File.OpenWrite(path);
StreamWriter writer = new StreamWriter(fileStream);
writer.Write($"{Name} : {Score} \n");
writer.Close();
}
}
答案 0 :(得分:1)
我认为问题在于构造函数在任何&#34;之前运行&#34;在你的代码中。在代码中(在构造函数中,在属性集中)和使用Step Into设置断点可能有助于查看所有代码的运行顺序。
因此,不是在构造函数中写入值,而是将其重构为实际方法。
更改行
public HighScores()
到
public void SaveScores()
然后在你&#34; new&#34;之后添加一行。你的对象。
David.SaveScores();
这应该有效。
我也考虑利用using / Dispose模式。
using (var fileStream = File.OpenWrite(path))
{
// do stuff
}
// dotNet will be sure to call Dispose and clean up the fileStream.
答案 1 :(得分:0)
正如Andre正确指出的那样,当您创建一个新的public HighScores()
对象时,会调用“构造函数”HighScores
。
HighScores David = new HighScores() { Name = "David", Score = 88 };
不幸的是,属性Name
和Score
尚未初始化。因为它是一个“构造函数”,所以只需像下面的普通构造函数那样传递变量:
HighScores David = new HighScores("David", 88);
然后在HighScores
“构造函数”中设置匹配签名,然后您可以设置属性,它应该按预期工作,但我同意Andre,因为这(写入文件)应该是一个单独的方法而不是“建设者”的一部分希望是有道理的。
public HighScores(string name, int score) {
Name = name;
Score = score;
using (FileStream fileStream = File.OpenWrite(path)) {
StreamWriter writer = new StreamWriter(fileStream);
writer.Write($"{Name} : {Score} \n");
writer.Close();
}
}
。