使用属性写入文件

时间:2017-02-09 05:22:47

标签: c# properties io

我在创建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();
    }
}

2 个答案:

答案 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 };

不幸的是,属性NameScore尚未初始化。因为它是一个“构造函数”,所以只需像下面的普通构造函数那样传递变量:

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();
  }
}