我有以下代码,我创建了一个对象,并将它通过一系列表单传递给用户控件。
public class MyObject
{
public List<AnObject> Objects {get; set;}
}
表格1:
private void MyObject _myObject = new MyObject{Objects = new List<AnObject>()};
...
Form2 form2 = new Form2(ref _myObject);
form2.Show();
表格2:
public Form2(ref MyObject myObject)
{
UserControl1 myControl = new UserControl1();
myControl.Objects = myObjects.Objects
}
的UserControl1
public List<AnObject> Objects {get; set;}
...
Objects.Add(new myObject());
当我向UserControl1中的对象添加新的myObject()时,它不会更新Form1上的原始列表。我通过引用传递myObject。我唯一能想到的就是以某种方式取消装箱我的值是当我将AnObject的列表分配给FormControl1时。我究竟做错了什么?
答案 0 :(得分:4)
ref 与此示例无关。如果没有参考,您将按照您的意图传递列表的引用(并且它将由两个表单共享)。 (代码中需要 ref 关键字 - 这是非常罕见的代码。)
List<T>
没有关于其更改的通知。因此,当您以一种形式更改其内容时,另一种不知道它。考虑使用ObservableCollection<T>
并在您的控件中订阅其CollectionChanged
事件。
答案 1 :(得分:2)
ref
甚至不需要。
当我向UserControl1中的对象添加新的myObject()时,它不会更新Form1上的原始列表
应该这样做。最好发布完全代码,这部分告诉我代码没有复制/粘贴:
public Form2(ref MyObject myObject)
{
UserControl1 myControl = new UserControl1();
myControl.Objects = myObjects.Objects // extra 's'
}
所以我们现在正在寻找代码中的一个小问题,它是真实内容的不精确副本。绝望。
答案 2 :(得分:1)
.NET中的对象无论如何都是引用类型。在这种情况下,ref
仅在您可能希望在同一参数中传回另一个对象而不是返回新对象时才是必需的。对于你在这里所做的事情,ref
完全没必要。 (与struct
s对比,它们是值类型,因此ref
执行更有用的功能)同样,由于对象已经是值类型,因此这里没有装箱或拆箱的概念。