#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 не передается по значению (где значение содержит только список, а не указатель на список).