2017-12-16 7 views
-2

クラスの新しいインスタンスを作成します。コンストラクタのパラメータの1つは、別のクラスのインスタンスのリストです。リストの新しいオブジェクトインスタンスは、ビットの後で空です。

コード:

ReserveringKamer reserveringkamer = new ReserveringKamer(_kamers.First(), Global.GeselecteerdeGasten, DateTime.Now); 
Global.KamerReserveringen.Add(reserveringkamer); 

Global.GeselecteerdeGasten.Clear(); 

私はリスト(Global.GeselecteerdeGasten.Clear();)をクリアするためにいくつかの時間後に空である理由があると思います。

私もGlobal.GastenGlobal.GeselecteerdeGastenにあるオブジェクトを格納するが、私はGlobal.GastenからGlobal.GeselecteerdeGastenにあるまったく同じオブジェクトを取得する方法がわかりません。

私の質問には意味があります。

編集:

ReserveringKamerコンストラクタ:

public ReserveringKamer(Kamer Kamer, List<Persoon> Personen, DateTime DatumAangemaakt) 
{ 
    this._Kamer = Kamer; 
    this._Personen = Personen; 
    this._DatumAangemaakt = DatumAangemaakt; 
} 
+0

[ask]を読んで[mcve]非常に簡単に。最後に、あなたは実際に質問していません。 – Enigmativity

+0

'ReserveringKamer'コンストラクタのコードを見せてください。 **参照**を「グローバル」に保存するだけです。GeselecteerdeGasten'を使っているので、 'clear()'を実行すると 'reserveringkamer'のリストも空になります(まあ、"も "ではなく、単に_same_リストです)。 –

+0

'List Personen'あなたのパラメータにタイプミスがあり、' this._Personen = Personen; 'コードが自分のコードを最初に確認します – MethodMan

答えて

1

これは「グローバル」の概念と問題の一つである - 何かがどこからでもアクセスして変更することができるならば、任意の場所することができますそれが空になる原因になります。あなたのコードは、どこかで、彼がリストをクリアしている行と、あなたが完全なリストであると思っていたところを見つける行が実際には空であることを認めているので、リストはコードのどこかでクリアされている

あなたの疑問にお答えするには十分な情報がありませんが(それはありませんがあなたの質問が何であるかを十分にはっきりと明かすことはできません。あなたが確認できる問題を述べましたが、「どうすればこのことを防ぐことができますか?」というような質問に関連しているなら、それを述べる必要があります。

コード内の任意の場所でリストの.Clearが呼び出されると、そのリストはクリアされますed。他のオブジェクトがその正確なリストへの参照を持っている場合、それは彼らのためにクリアになりすぎ

クラスFooMyListプロパティを持っていた、とあなたは新しいfooとMYLISTのための新しいリストを作成し、記入し(それはList<Person>だと想像​​することができます)場合それが10人のインスタンスである場合、Barが項目を追加すると(_foo.MyList.Addを呼び出して)FooのインスタンスをBarとBazの両方に渡すと(Fooへの参照またはリストへの参照を格納する) 、バーとバズは11の項目を参照してください。 Barがリストをクリアした場合、FooとBazは空になったと見なします。これを防ぐ唯一の方法は、同じリストを参照するのではなく、Barの別のリストをクローン/作成することです(など) fooInstance.MyListからすべての項目をBar.OtherListに追加します(例:Barが_bar.OtherList.AddRange(_foo.MyList)を実行すると、データ項目を共有する2つの異なるリストオブジェクトインスタンスが作成されます(各リストの各データ項目インスタンスも別のリストで参照されます)ただし、Fooの.MyListを消去すると、Barの.OtherListはクリアされません。ただし、リスト項目自体を操作すると、その変更が他のリストに表示されます(例:_foo.MyList [0] .Name = "John"、now _bar)。 'Global.GeselecteerdeGasten.Clear(); `がlisをクリアしているというアサーションをテストすることもできるようにする必要があります([Other] [0] .NameもJohnになります)

+0

あなたのご協力と時間をいただきありがとうございます!あなたの説明と例のおかげで、私は自分の問題を解決することができました。プロパティを 'private list _Personen = new List ();に変更し、コンストラクタで' this._Personen.AddRange(Personen); 'を行いました。そして、これは完璧に働く、私は本当にあなたの時間と労力を感謝します。 – SjaakvBrabant

関連する問題