【问题标题】:Unwanted member change because of reference由于引用而导致不需要的成员更改
【发布时间】:2021-11-11 06:52:29
【问题描述】:

我正在编写一段代码,但无法弄清楚为什么它会显示一些(从我的角度来看)奇怪的行为。我明白这是由于我编写代码的方式,但我不明白为什么它没有做我想做的事情。

我有一个事件处理程序:

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

【问题讨论】:

  • server.karts = e.ToList() ?请注意,ToList() 不会复制卡丁车,只会创建列表的副本。如果不小心可能会导致其他副作用

标签: c# parameter-passing


【解决方案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() 将创建一个新的 List 实例,其值与原始实例相同。

【讨论】:

  • 谢谢!这行得通!我不明白为什么 e 不按值传递(其中值仅包含列表,而不是指向列表的指针)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-17
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多