2010-12-01 47 views
0

我有以下代码,我创建一个对象,并通过一系列的窗体传递给用户控件。我在这个例子中错过了什么参考类型?

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()); 

当我添加新myObject的()中的UserControl1对象,它不在Form1上不更新我的原始列表。我通过引用传递myObject。我能想到的唯一事情就是以某种方式拆箱我的值是当我将AnObject的列表分配给FormControl 2到UserControl1时。我究竟做错了什么?

+2

您还没有显示足够的代码来告诉我们发生了什么。请提供一个简短但完整的程序 - 理想情况下是一个控制台应用程序,因为我认为不需要在此处涉及用户界面。正如亨克所说,你甚至不需要`ref`在这里。 – 2010-12-01 21:03:32

回答

4
  1. ref与此示例没有任何关系。如果没有ref,您将按照您的意愿传递您的列表的引用(并且它将由这两种表单共享)。 (代码,其中参考关键字是需要的 - 真的很罕见的代码。)

  2. List<T>没有通知其变化。所以当你以一种形式改变它的内容时,另一个不知道它。考虑在您的控件中使用ObservableCollection<T>并订阅其CollectionChanged事件。

2

ref甚至不是必需的。

当我添加一个新的myObject的()到对象中的UserControl1,它不会在Form1上

更新我原来的名单应该那样做。更好的发布确切代码,这部分显示了我的代码是不可复制/粘贴:

public Form2(ref MyObject myObject) 
{ 
    UserControl1 myControl = new UserControl1(); 
    myControl.Objects = myObjects.Objects // extra 's' 
} 

所以我们现在正在寻找代码的一个小问题是真正的东西不精确的副本。绝望。

1

.NET中的对象无论如何都是引用类型。在这种情况下,ref只有在您想要在同一个参数中传回不同对象而不是返回新对象时才有必要。对于你在这里做什么,ref是完全没有必要的。 (与struct s对比,它们是值类型,所以ref做的更有用处)类似地,因为对象已经是值类型,所以这里没有装箱或取消装箱的概念。

相关问题