2010-12-01 7 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:私はのUserControl1内のオブジェクトに新しいmyObjectという()を追加すると

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

UserControl1が

public List<AnObject> Objects {get; set;} 
... 

Objects.Add(new myObject()); 

は、それはdoesnのForm1で元のリストを更新しません。 myObjectを参照渡ししています。私が考えることができるのは、私の値をアンボックスするのは、フォーム2にAnObjectのリストをUserControl1に割り当てるときだけです。私は間違って何をしていますか?

+2

何が起こっているのかを伝えるための十分なコードが表示されていません。短くて完全なプログラムを提供してください。理想的には、コンソールアプリケーションです。ここでは、ユーザーインターフェイスを取得する必要はありません。 Henkが言ったように、あなたはここでも 'ref'を必要としません。 –

+1

myObjectsをコントロール(たとえばListBox)のデータソースとして使用していて、そのコントロールがmyObjectsに追加されても更新されませんか? – m0sa

答えて

4
  1. 参照は、この例では何もありません。 refがなければ、意図したとおりにリストの参照を渡します(また、両方のフォームで共有されます)。 (の照会のキーワードが必要です - 実際はまれなコードです)

  2. List<T>は変更についての通知を受けていません。だから、あなたがその内容をある形式で変更すると、もう1つはそれについて知りません。 ObservableCollection<T>を使用し、そのコントロールのCollectionChangedイベントを購読することを検討してください。

2

refは必要ありません。 UserControl1内のオブジェクトへ

私は新しいmyObjectというの(追加)、それはそれはそれをやるべきForm1の

に私の元のリストを更新しません。

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

だから我々は今、現実のものの不正確なコピーであるコードの小さな問題を探しています:より良い正確なコードを投稿し、この部分は、コードをコピーしていなかった/貼り付け、私を示しています。ホープレス。

1

.NETのオブジェクトはいずれにしても参照型です。この場合、refは、新しいオブジェクトを返すのではなく、別のオブジェクトを同じパラメータに戻したい場合にのみ必要です。あなたがここで何をしているのか、refは完全に不必要です。 (値のタイプであるstructと対照的に、refはもっと潜在的に役に立つものです)同様に、オブジェクトは既に値型であるため、ここではボクシングまたはアンボクシングの概念はありません。

関連する問題