我真的很困惑,希望有人能够帮助我解决我遇到的问题。我想使用GET命令从新的Form获取一个值,但我的代码覆盖了我在构造函数中传递的参数,我不知道为什么。对C#不太熟悉。
这是我点击特定按钮时使用的脚本。这是一个新的表单,我将参数列表传递给参数(参数将被修改,我不想这样做):
private void btn_t1_Click(object sender, EventArgs e) {
InterfaceT1 Formulaire_T1 = new InterfaceT1(**this.Liste_T1**);
if (Formulaire_T1.ShowDialog() == DialogResult.OK) {
//I WOULD WANT TO USE THE GET COMMAND HERE ONLY IF I CLICK 'OK' ON THE FORM
}
Formulaire_T1.Dispose();
}
以下是Form Formulaire_T1的构造函数供参考:
public InterfaceT1(List<T1> Liste_T1) {
InitializeComponent();
this.Liste_T1s = new List<T1>(Liste_T1); //suggested, does not change anything
UpdateView(0);
}
我在Interface_T1
中使用的方法会修改Liste_T1s
,但为什么它也会在主函数中更改Liste_T1
?我没有回报任何价值。现在这些价值似乎已经联系起来了?我知道它必须是一件简单的事情,但无法弄明白。
答案 0 :(得分:3)
InterfaceT1
中的方法修改传入的列表的原因是构造函数存储对列表的引用,而不是复制它。按如下所示更改构造函数以解决此问题:
public InterfaceT1(List<T1> Liste_T1) {
InitializeComponent();
this.Liste_T1s = new List<T1>(Liste_T1); // Make a copy
UpdateView(0);
}
请注意,此更改将生成列表本身的副本,但不包含其元素:它们将保持不变。添加/删除复制列表中的元素将没有问题,但修改单个元素将在原始文件中可见。要解决此问题,请按如下所示更改代码:
public InterfaceT1(List<T1> Liste_T1) {
InitializeComponent();
this.Liste_T1s = Liste_T1.Select(t => new T1(t)).ToList();
UpdateView(0);
}
在上面的代码中,我假设可以通过调用另一个T1
实例的“复制”构造函数来创建T1
的新实例,并复制其字段。
答案 1 :(得分:2)
List
是引用类型。这意味着如果您将其作为参数传递给另一个方法,则不会传递列表的副本,而是传递指向原始列表的引用。