2017-02-09 12 views
0

Я пытаюсь записать файл в момент создания моего объекта HighScores. Я пытаюсь использовать свойства Name и Score как текст в файле, но они кажутся нулевыми и 0 соответственно, хотя я инициализировал объект. Поэтому мой вопрос: почему он не пишет «Давид: 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

Как Андре правильно указывает, «Конструктор» public HighScores() вызывается при создании нового объекта HighScores как у вас есть ниже.

HighScores David = new HighScores() { Name = "David", Score = 88 }; 

К сожалению, свойства Name и Score не были инициализированы. Так как это «конструктор» просто передать переменные, как вы бы нормальный конструктор, как показано ниже:

HighScores David = new HighScores("David", 88); 

Затем установите соответствующую подпись в HighScores «Конструктор», то вы можете установить свойства и он должен работать, как ожидалось , однако я согласен с Андре, поскольку это (запись в файл) должно быть отдельным методом, а НЕ частью надежды «Конструктор», которая имеет смысл.

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

.

+0

Хорошая точка. Я думал, что инициализаторы работают одновременно с конструктором, но они запускаются сразу же. – DRockClimber

1

Я думаю, что проблема заключается в том, что конструктор работает до любого из «наборов» в вашем коде. Установка контрольных точек в вашем коде (в вашем конструкторе, в наборах свойств) и с использованием Step Into может помочь увидеть, в каком порядке выполняется весь код.

Итак, вместо того, чтобы записывать значения в конструкторе, рефакторинг, который в фактический метод.

изменение линии

public HighScores() 

в

public void SaveScores() 

затем добавьте строку после "новый" до объекта.

David.SaveScores(); 

Это должно сработать.

Я также рассмотрю использование схемы использования/удаления.

using (var fileStream = File.OpenWrite(path)) 
{ 
    // do stuff 
} 
// dotNet will be sure to call Dispose and clean up the fileStream. 
+0

хорошая альтернатива, спасибо! – DRockClimber