Проблема заключается в следующих статических свойствах класса ReadFromFile
, если я предполагаю, что "перезаписано", то вы имеете в виду, что оба экземпляра UserFile
указывают на одни и те же данные:
public static Dictionary<int, Family> families = new Dictionary<int, Family>();
public static Dictionary<int, Individual> individuals = new Dictionary<int, Individual>();
public static Header head;
Проблемалежит в конструкторе UserFile
об использовании статических свойств.
ReadFromFile.Read(_dir);
fileIndividuals = ReadFromFile.individuals; // <-- Uh-oh!
fileFamilies = ReadFromFile.families; // <-- Uh-oh!
fileHead = ReadFromFile.head; // <-- Uh-oh!
Что здесь происходит, так это переменные-члены fileIndividuals
, fileFamilies
и fileHead
на ссылку свойств individuals
, families
и head
на статический класс ReadFromFile
, не копию (так как они являются классами, а не типами значений),Поэтому в следующий раз, когда ReadFromFile.Read()
вызывается, статические свойства ReadFromFile
обновляются (перезаписываются), но предыдущий экземпляр UserFile
просто указывает на те же самые статические свойства, следовательно file1
и file2
будет иметь те же данные.
Так как бы это исправить?Два варианта:
- Сделать
ReadFromFile
и экземпляр класса, а не статический.Создайте новый экземпляр в конструкторе UserFile
и не используйте любые статические свойства. - Создайте копию данных в
individuals
, families
и head
вконструктор UserFile
."foreach" через каждый элемент и скопируйте его в новый словарь.
Простое объяснение:
Когда вы выполняете присваивание (символ = в C #), если объект является классом, тогда цели присваивается «указатель» (ссылка) на правой стороне.Если это тип значения, он копируется.Словарь - это класс, поэтому вы получаете указатель, а не копию.
Иллюстрация в коде:
public static class MyStaticClass
{
public static List<string> MyList = new List<string>
}
В другом месте ...
public void MyMethod()
{
List<string> myList1 = MyStaticClass.MyList;
List<string> myList2 = MyStaticClass.MyList;
myList1.Add("Hello"); // Add to first list
myList2.Add("World"); // Add to second list
foreach(string item in myList1) // print all items in the second list
{
Console.WriteLine("List 1: " + item);
}
foreach(string item in myList2) // print all items in the second list
{
Console.WriteLine("List 2: " + item);
}
}
Результат будет:
List 1: Hello
List 1: World
List 2: Hello
List 2: World
Но почему?Мы только добавили «Мир» к myList2
.Ну myList1
и myList2
указывают на одно и то же.Когда мы сделали myList1 = MyStaticClass.MyList
, мы не получили копию предмета, просто ссылку на него.