Нежелательное изменение участника из-за ссылки

#c# #parameter-passing

Вопрос:

Я пишу фрагмент кода, но не могу понять, почему он демонстрирует некоторое (с моей точки зрения) странное поведение. Я понимаю, что это связано с тем, как я написал код, но я не могу понять, почему он не делает то, что я хочу.

У меня есть обработчик событий:

 private void heatFinishedHandler(object sender, List<Kart> e)
    {
        mainForm.enableControls();
        server.karts = e;
    }
 

Если я добавлю e.Clear(); к нему, он также очистится server.karts .

Аргумент e исходит из другого класса:

 private List<Kart> kartlist = new List<Kart>();

heatFinished?.Invoke(this, kartlist);
 

heatFinished Событие и heatFinishedEventHandler то связаны между собой.

Что мне нужно сделать, чтобы получить e значение, а не ссылку? Или это тип значения, но указывает ли оно на kartlist ?

Я хочу иметь возможность получить значение e и сохранить его server.karts , не имея возможности изменить kartlist .

Комментарии:

1. server.karts = e.ToList() ? Обратите внимание, ToList() что не копирует карты, а только создает копию в списке. Что может привести к другим побочным эффектам, если вы не будете осторожны

Ответ №1:

Сделайте копию списка, который вы передаете функции, как

 private List<Kart> kartlist = new List<Kart>();

heatFinished?.Invoke(this, kartlist.ToList());
 

Или сделайте это внутри функции, например

 private void heatFinishedHandler(object sender, List<Kart> e)
{
    mainForm.enableControls();
    server.karts = e.ToList();
}
 

.ToList() создаст новый экземпляр списка с теми же значениями, что и у исходного.

Комментарии:

1. Спасибо! Это работает! Я не понимаю, почему e не передается по значению (где значение содержит только список, а не указатель на список).