C#参数传递异常

时间:2014-08-29 20:43:13

标签: c# list parameters reference instance

所以当我发生这种奇怪的行为时,我只是编码:

public NumPadComboListener(List<String> master)
{

  _listen = new MultiKeyListener(false);
  List<String> seq = master;
  seq.Add("NumPad0");
  _listen.registerNewKeySequence(0, seq);
  seq.Remove("NumPad0");
  seq.Add("NumPad1");
  _listen.registerNewKeySequence(1, seq);
  seq.Remove("NumPad1");
  seq.Add("NumPad2");
  _listen.registerNewKeySequence(2, seq);
  seq.Remove("NumPad2");
  seq.Add("NumPad3");
  _listen.registerNewKeySequence(3, seq);
  seq.Remove("NumPad3");
  seq.Add("NumPad4");
  _listen.registerNewKeySequence(4, seq);
  seq = null;

}

它只是放入一个列表列表。 但奇怪的是,最后的列表包含了传入的最后一个版本“seq”的5个副本。

elem 1, elem2, NumPad4
elem 1, elem2, NumPad4
elem 1, elem2, NumPad4
elem 1, elem2, NumPad4
elem 1, elem2, NumPad4

如何将列表作为单独的实例传递而不是像现在看起来那样的引用?

1 个答案:

答案 0 :(得分:0)

  

如何将列表作为单独的实例传递而不是像现在看起来那样的引用?

您必须显式创建一个全新的列表,并传入对该新列表的引用。您可以使用ToList使用非常少的代码执行此操作,即使在幕后它仍然需要将每个项目复制到创建的新列表。

然后,您需要相应地更改所有方法调用:

_listen.registerNewKeySequence(0, seq.ToList());

如果您不希望此方法改变传入的master列表,那么您需要复制列表本身(而不是对它的引用) )在方法开始时将新列表分配给seq