混淆变量被覆盖

时间:2013-11-17 23:08:13

标签: c# parameters overwrite

我真的很困惑,希望有人能够帮助我解决我遇到的问题。我想使用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?我没有回报任何价值。现在这些价值似乎已经联系起来了?我知道它必须是一件简单的事情,但无法弄明白。

2 个答案:

答案 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引用类型。这意味着如果您将其作为参数传递给另一个方法,则不会传递列表的副本,而是传递指向原始列表的引用。