尝试按值将列表传递给表单而不是引用

时间:2016-04-27 18:08:48

标签: c#

使用GenericList处理我正在存储数据的项目,基于我创建的包含少量字符串成员的类。这很好用,但是当我尝试将此列表传递给第二个表单时,事情变得很麻烦。我最初在第二种形式中设置一个get / set块来接受列表,然后返回它,但目标始终为null。作为一种解决方法,我将第二个表单上的本地列表更改为public并且能够以这种方式访问​​它,但是然后我得到了ByRef传递而不是获取列表的副本,因此所做的任何更改都会反映在主列表中。由于我希望不能接受这些更改,我真的希望这是一个值传递。这两个问题必须联系起来......

这是设置。在form1中,我在类级别有这个定义,这使得它有点像一个全局变量(是的,它很糟糕,但它对我有用):

private List<ServerList> theServerList = new List<ServerList>();

稍后我创建新表单并(尝试)使用以下方法将数据传递给它:

frmEditor theEditor = new frmEditor();
theEditor.updatedServerList = theServerList;
DialogResult res = theEditor.ShowDialog();

在第二个,我有这个接收数据:

private List<ServerList> myServerList = new List<ServerList>();

public List<ServerList> updatedServerList
{
    get { return myServerList; }
    set { myServerList = updatedServerList; }
}

这导致form2(myServerList)上的列表始终为空。由于这不起作用,我注释掉了所有这些行,并将form2上的myServerList定义更改为public。现在,在实例化form2后,我可以通过这样做来获取数据:

theEditor.myServerList = theServerList;

这可以使数据很好地显示form2,但是这种赋值只是将内存中数据块的指针从一个变量复制到另一个变量(基本上是ByRef传递),所以我在form2上做的任何更改改变&#34;两者&#34;列表,因为它们是相同的。我想在form2中有一个本地副本,所以我可以进行更改然后接受它们,具体取决于用户是否单击取消(删除所有更改),或者确定(将form2中的本地数据复制回form1)。

1 个答案:

答案 0 :(得分:2)

您的原件不起作用,因为您的二传手应该是:

public List<ServerList> updatedServerList
{
    get { return myServerList; }
    set { myServerList = value; }
}

如果要复制列表,可以对传入值使用ToList

public List<ServerList> updatedServerList
{
    get { return myServerList; }
    set { myServerList = value.ToList(); }
}

这与&#39;按价值&#39;无关。 vs&#39;参考&#39;由于List<T>是引用类型,因此类型List<ServerList>的变量的值是复制到setter方法的引用。此引用将指向调用者和接收者类中的同一对象。如果要复制列表的内容,则需要使用ToList或类似内容手动执行。