Неверные данные? Баг C# или я что-то упустил?

194
19 марта 2018, 22:57

Есть двойной цикл for с проверкой внутри на совпадение с заранее добытым массивом id

Тоесть цикл добавляет в List объект из перебраного списка у которого совпал id

getInfo - внутренний метод класса который выводит содерживмое класса

dfood - список нужных id

masses - список значений которые нужно общитать и установить

temp - список всех id по одному

result - схожий по сути список как и temp (тоже List), но с повторениями

Если ещё вкратце, то готовый объект который нужно добавить верный, а при выходе их циклов там левые объекты (копии последних добавленых подобных)

for (int i = 0; i< dfood.Count; i++)
    {
        for(int j = 0; j < temp.Count; j++)
        {
            if(temp[j].id == dfood[i])
            {
                food temp2 = temp[j];
                int c = temp2.cal;
                temp2.setCalory((int)(((double)c / 100) * masses[i]));
                result.Add(temp2);
                result[result.Count-1].getInfo();//выводит верную инфу 100%
            }
        }
    }
    foreach (food cal in result)
    {
        cal.getInfo(); // не верная инфа
    }

Собственно сам класс

class food
{
    public int id;
    public string name;
    public string typePr;
    public int cal;
    public string desk;
    public food(int id_, string name_, string typePr_, int cal_, string desk_)
    {
        id = id_;
        name = name_;
        typePr = typePr_;
        cal = cal_;
        desk = desk_;
    }
    public void setCalory(int c)
    {
        cal = c;
    }
    public void getInfo()
    {
        Debug.WriteLine("----------------");
        Debug.WriteLine("id: " + id);
        Debug.WriteLine("name: " + name);
        Debug.WriteLine("typePr: " + typePr);
        Debug.WriteLine("cals: " + cal);
        //Debug.WriteLine("desc: " + desk);
        Debug.WriteLine("----------------");
    }
}

Если врубить вот это дебаг-логирование в консоль, то я ожидал от последнего foreach увидеть примерно вот такое

----------------
id: 4
name: батон
typePr: Хлебобулочное
cals: 238
----------------
----------------
id: 4
name: батон
typePr: Хлебобулочное
cals: 240
----------------
----------------
id: 4
name: батон
typePr: Хлебобулочное
cals: 242
----------------

Но на самом деле то вот так выходит. Хотя вывод в цикле, в условии такой как нужно (ну как в верху)

----------------
id: 4
name: батон
typePr: Хлебобулочное
cals: 242
----------------
----------------
id: 4
name: батон
typePr: Хлебобулочное
cals: 242
----------------
----------------
id: 4
name: батон
typePr: Хлебобулочное
cals: 242
----------------
Answer 1

Потому что все ссылки ссылаются на один и тот же объект.

PS: В чем суть отличия между ссылочными и значимыми типами данных в C#?

READ ALSO
WPF проблема со 2 формой

WPF проблема со 2 формой

Добавил вторую форму, подскажите, как в файле Appxaml добавить стиль на вторую форму? P

241
.NET Native компиляция

.NET Native компиляция

Как скомпилировать проект вNET Native? Нужного пункта нету, как его включить?

208
Разбивка строки на подстроки по двум условиям

Разбивка строки на подстроки по двум условиям

Есть строка, необходимо разбить её на подстроки по 2 условиям:

195