调用期望对象数组的方法

时间:2016-01-05 22:25:56

标签: c# oop

我正在学习C#并编写了一个控制台程序来保存一个高分数到一个文件。虽然该程序有效,但我如何让它工作让我感到不安,感觉更像是一个黑客而不是一个解决方案所以我正在寻找关于如何编写它的指导。

我目前在Main方法中做的是:

  1. 声明一个高分对象数组
  2. 初始化它们
  3. 为数组指定一些值。
  4. 我很高兴我到目前为止所做的一切,以下两个让我感到不安的步骤

    1. 然后我宣布另一个HighScore对象
    2. 我使用此对象将高分数组传递给SaveHighScores方法。
    3. 这是我的代码:

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      using System.IO;
      
      namespace HighScore
      {
          class HighScore
          {
              public string Name { get; set; }
      
              public int Score { get; set; }
      
              public void SaveHighScores(HighScore[] highScores)
              {
                  string allHighScoresText = "";
      
                  foreach (HighScore score in highScores)
                  { 
                      allHighScoresText += $"{score.Name},{score.Score}" + Environment.NewLine;
                  }
      
                  File.WriteAllText("C:/Temp/highscores.csv", allHighScoresText);
              }
      
              static void Main(string[] args)
              {
                  HighScore[] highScore = new HighScore[2];
      
                  for (int i = 0; i < highScore.Length; i++)
                  {
                      highScore[i] = new HighScore();
                  }
      
                  highScore[0].Name = "A";
                  highScore[0].Score = 100;
      
                  highScore[1].Name = "B";
                  highScore[1].Score = 200;
      
                  // are the following two lines correct or am I missing something?
                  HighScore hs = new HighScore();
      
                  hs.SaveHighScores(highScore);
      
              }
          }
      }
      

2 个答案:

答案 0 :(得分:6)

SaveHighScores设为静态,您不需要HighScore的实例来调用它。 (您可以直接将其称为HighScore.SaveHighScores()

答案 1 :(得分:3)

我更喜欢从您对此数据执行的操作中拆分数据的表示形式。所以我会选择两个类,一个用于Data,一个用于Save / Load和其他业务逻辑

public class HighScore
{
    public string Name { get; set; }
    public int Score { get; set; }
}

// This class handles the core work to persist your data on the storage medium
// The class is static so you don't need to declare instances and use directly the methods available.
public static class Repo_HighScore
{
    // For simplicity, no error Handling but, for a robust implementation,
    // error handling is required
    public static bool SaveHighScores(HighScore[] highScores)
    {
        StringBuilder allHighScoresText = new StringBuilder();
        foreach (HighScore score in highScores)
            allHighScoresText.AppendLine($"{score.Name},{score.Score}"); 

        File.WriteAllText("C:/Temp/highscores.csv", allHighScoresText.ToString());
    }
    public static HighScore[] LoadHighScores()
    {
        List<HighScore> hs = new List<HighScore>();
        foreach(string line in File.ReadLines("C:/Temp/highscores.csv"))
        {
           string[] parts = line.Split(',');
           HighScore temp = new HighScore() 
                { Name = parts[0], Score = Convert.ToInt32(parts[1])};
           hs.Add(temp);
        }
        return hs.ToArray();
    }
}