2012-03-25 9 views
0

私のアプリではパフォーマンスの最適化を行っていましたが、リストボックスのitemssourceプロパティにコレクションを割り当てる場所がたくさんありました。リストボックスにコレクションを割り当てると、メモリから元のコレクションが削除されます。そうでない場合は、nullに設定することでガベージコレクションのコレクションをマークしますか?例えばコレクションをアイテムソースに割り当てた後にコレクションをnullに設定すると、リソースがクリアされますか?

void myWebServiceCompleted(object sender, List<Item> itemList) 
{ 
    ItemListBox.ItemsSource = itemList; 
    //Would setting itemList = null clear up resources? 
} 

割り当てのこのタイプは、アプリ内の複数の場所で作られているので、上の二回のメモリを意味する真である場合、私はただ心配していました。

答えて

1

は、リストボックスは、元のリストへの参照を保持しているので、ガベージコレクトではありません。 何らかの理由で元のリストを収集したい場合は、ListBoxにListItemを手動で追加できます。

この場合、他の参照がない限り、元のリストが収集される可能性があります。

あなたのコレクションの各アイテムがリソースが重く、リストボックスが2つのフィールド(名前とIDなど)を知る必要がある場合に便利ですね

1

いいえ、そうではありません。 itemListは参照型です。あなたが思っているように複製されていません。代わりに、複数の参照があります。同じ住所のメールで複数の手紙を受け取るようなものです。その住所の家が複製されていることを意味するものではなく、同じ家を参照する複数の住所があるということだけではありません。

1つのルートオブジェクトがあなたのコレクションを参照している限り、ガベージコレクタによって解放されません。 itemListをnullに設定しても、このコレクションで使用された合計領域には影響しません。

このタイプの割り当てはアプリ内の複数の場所で行われています。これはメモリが2倍であることを意味しています。

これは意味しません。この非常に重要な点を理解するまで、参照型についてやっていることをすべて読んだり読んだりすることを強くお勧めします。ジョエル・スポルスキが考える理由

私は今理解し、すべてのプログラマが学ぶべきC.

関連する問題