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) изменяют локальную копию структуры. Вы пытаетесь сделать структуру как ссылочный тип.

Изменения, внесенные в структуру внутри функции, не изменяют значение исходной структуры - структура копируется в стек перед передачей в функцию.

Другие вопросы по тегам