C# пропущение через список<struct> не изменит значения
У меня есть структура, содержащая информацию об условиях.
private struct hintStructure
{
public string id;
public float value;
public bool alreadyWarned;
}
private List<hintStructure> hints;
Всякий раз, когда моя программа изменяет значение, отправляется событие и проверяется список условий, если этот элемент удовлетворяет условию.
public void EventListener (string id)
{
CheckHints(id); //id of the updated element
}
private void CheckHints(string _id)
{
foreach (hintStructure _h in hints)
if (_h.id == _id) CheckValue(_h);
}
private void CheckValue(hintStructure _h)
{
float _f = GetValue(_h.id);
if (_f < _h.value)
{
ActivateHint(_h);
_h.alreadyWarned = true;
}
else
_h.alreadyWarned = false;
}
private void ActivateHint(hintStructure _h)
{
if(_h.alreadyWarned == false)
ShowPopup();
}
ShowPopup()
должен вызываться только тогда, когда он еще не был показан для этого конкретного элемента (обозначен как bool alreadyWarned
). Проблема в том, что это всегда показано. Похоже на линию _h.alreadyWarned = true;
вызывается, но значение не сохраняется (я проверил, вызывается ли он, так и есть). Я предположил foreach
может быть проблема (так как он был глючит несколько лет назад), но он не работает с for()
структура либо.
Мое последнее предположение - проблема адресации, типичная проблема в C++:CheckValue(h); vs. CheckValue(&h);
Но если я прав в этом предположении - как я могу решить это?
2 ответа
Проблема в том, что структуры в C# имеют тип значения, поэтому при вызове CheckValue(_h)
вы создаете копию _h
и эта копия обновляется, но оригинал в списке остается нетронутым.
Классическое решение передает этот экземпляр по ссылке (ref
), но вы не можете сделать это с foreach
переменные.
Решение проблемы hintStructure
к классу:
private class Hint
{
public string id;
public float value;
public bool alreadyWarned;
}
Вы передаете структуру, а не экземпляр класса. Изменения в структуре (не переданные как ref) изменяют локальную копию структуры. Вы пытаетесь сделать структуру как ссылочный тип.
Изменения, внесенные в структуру внутри функции, не изменяют значение исходной структуры - структура копируется в стек перед передачей в функцию.