2010-12-01 53 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做的更有用處)類似地,因爲對象已經是值類型,所以這裏沒有裝箱或取消裝箱的概念。

相關問題