2013-05-02 4 views
0

В настоящее время я тестирую приложение, в котором хранятся контактные данные пользователя в файле. Эта информация также сохраняется в локальной компактной базе данных в качестве основного метода - сохранение их данных в этом файле является резервной копией, если эти данные будут потеряны.Неожиданные результаты с StreamReader.ReadLine()

Файл, который я использую для тестирования, содержит мои личные данные, поэтому, надеюсь, вы понимаете, что я заменил строки заполнителями! Структура этого файла выглядит следующим образом (минус первая линия):

Ниже, у меня есть некоторый код, который считывает этот файл и сохраняет в каждой строке в качестве переменной. Структура файла никогда не изменится, поэтому очень простой код:

public static bool RestoreBusinessTable(out string title, out string busName, out string mobileNumber, out string firstName, out string lastName) 
     {  
      string email = "", referral = "", contactNo, addressLine1 = "", addressLine2 = "", city = "", postcode = "", country = "", district = ""; 
      busName = null; 
      mobileNumber = null; 
      firstName = null; 
      lastName = null; 
      title = null; 

      try 
      { 
       if (!File.Exists(fileName)) 
        return false; 
       StreamReader sr = new StreamReader(fileName); 
       string work; 
       work = sr.ReadLine(); // Empty line 
       work = sr.ReadLine(); // Empty line 
       busName = sr.ReadLine(); 
       title = sr.ReadLine(); 
       firstName = sr.ReadLine(); 
       lastName = sr.ReadLine(); 
       email = sr.ReadLine(); 
       referral = sr.ReadLine(); 
       addressLine1 = sr.ReadLine(); 
       addressLine2 = sr.ReadLine(); 
       city = sr.ReadLine(); 
       postcode = sr.ReadLine(); 
       country = sr.ReadLine(); 
       work = sr.ReadLine(); // Empty line 
       work = sr.ReadLine(); // Empty line 
       contactNo = sr.ReadLine(); 
       district = sr.ReadLine(); 
       mobileNumber = sr.ReadLine(); 
       sr.Close(); 
       // Add to database here 
       return true; 
      } 
      catch 
      { 
       return false; 
      } 
     } 

При выполнении этого кода, я заметил, что busName, title, firstName и lastName все имели значение 07777123456. Данные выглядели так:

07777123456 
07777123456 
07777123456 
07777123456 
[email protected] 

Address Line 1 
Address Line 2 
City 
Postcode 
Country 




07777123456 

У меня нет асинхронных процессов или потоков, которые записываются в файл одновременно. Может ли кто-нибудь пролить свет на то, что здесь происходит, и почему первые четыре строки будут отображаться как номер мобильного телефона?

+2

То, что вы говорите, не может произойти с помощью кода, который вы опубликовали. Как вы называете этот код и как вы печатаете переменные? Также попробуйте использовать объект передачи данных вместо бесчисленных параметров 'out'. – CodeCaster

+2

Похоже, вы многократно переписываете 'work'. Это займет только последнее значение, которое вы назначили ему. – RichardTowers

+0

О, извините, это не одна из ваших «выходных». – RichardTowers

ответ

5

Один из способов сделать это было бы для вызывающего кода поставить адрес/поля той же переменной в к различным out параметрам:

string tmp; 
RestoreBusinessTable(out tmp, out tmp, out tmp, ...); 

Здесь же адрес передается в каждом месте, поэтому независимо от того, ваш код присваивает title, busName и т. д. это , записывая в то же фактическое местоположение.

Поскольку mobileNumber присвоен последнему, значение, присвоенное для мобильного номера, будет значением, которое отображается для всех значений.

Ключевым моментом здесь является то, что title, busName и т.д. не являются каждый ссылка на строку - из-за out (или ref, поровну) они являются каждый ссылка на ссылку в строку.

+0

Я на самом деле не следовал за вами, пока вы не написали «они являются ссылкой на ссылку на строку». Это внезапно сделало проблему очень ясной для меня. Спасибо! –

Смежные вопросы