2

私の最初の目的は、TCPストリームを通してリストを非同期で送信することです。しかし、非同期スレッドにリストを渡した直後に、新しいデータでもう一度それを埋めるために、それをクリアする必要があります。だから私は、リストのコピーを作成するために、浅いクローニングを使用し、バックグラウンドスレッドに渡し:元のリストがクリアされた場合、浅いクローンリスト内の項目はどうなるでしょうか?

private List<MyDataObject> GetShallowCloneOfDataList(List<MyDataObject> dataEvents) 
{ 
    return new List<MyDataObject>(dataEvents); 
} 

、ここでは私の最終的なコードです:

List<MyDataObject> data = new List<MyDataObject>(); 
while(hasMoreData) 
{ 
    data.clear(); 
    FillListFromServer(data); 
    List<MyDataObject> clonedList = GetShallowCloneOfDataList(data); 
    Task.Run(() => SendDataList(clonedList)); 
} 

私がクリアしたときに私の質問は、あります元のリストdata、クローンリスト内のアイテムも影響を受けますか?私のコードをテストすると、影響を受けていないことが明らかになりましたが、大量のデータ(毎秒200K)を処理するときにこれが真実であるかどうかはわかりません。

+0

参照型とは何か – mybirthname

+0

あなたの質問(以下に回答)とは別に、リストのクローンをSendDataListに渡して自分のリストをクリアするのはなぜですか?なぜ元のリストを関数に渡さないのですか?このオリジナルのリストにもう触れずに新しいリストを記入してください。はるかに効率的ですね。 –

+0

@HaraldCoppoolse、確かにこれはより効率的ですが、残念ながら状況は上記のコードスニペットよりはるかに複雑です。元のリストは、データサーバーからプッシュされたイベントで新しいデータを埋め込むオブザーバークラスにアプリケーションの開始時にフックされるので、新しいリストを作成することはできません:( –

答えて

4

いいえ、ガベージコレクションの対象となる可能性はありますが、既存のアイテムは影響を受けません。

これは単なる事実、nullに変数を設定するようなものです:

MyDataObject x = new MyDataObject(); // And populate 
MyDataObject y = x; // Just copy the reference 
x = null; // This doesn't change either y or the data in the object 

あなたはお友達やご家族のアドレスの完全なアドレス帳を持っていて、その後、火の上にそれを投げた場合はそれについて考えて別の方法があります...あなたはあなたの友人や家族がどこにいたのかを知ることができませんでしたが、住んでいた場所は変わりませんでした。 (この種の類推については、this answerを参照してください。)

+0

だから、 –

+1

@HassanMokdad:確かに、同じオブジェクトを参照する2つの独立したコレクションがあります。たとえば、2つのアドレス帳のようなものです。同じアドレスのセットを持っている。そのうちの1つのアドレスからすべてのアドレスを消去しても、家や他のアドレス帳は変更されません。 –

+0

いい例をありがとう:) –

1

だから、このように考えてみましょう。メモリにオブジェクトがあり、各インデックスがこれらのオブジェクトの1つをメモリ内で参照するリストがあります。あなたは、インデックス0でのList1の基準となる同指数で同じオブジェクトを参照する新しいリストを作成することを決めた

はインデックス0

でLIST2の参照と同じである今、あなたはクリア最初のリスト(2番目のリストの存在を知らない)。あなたの2番目のリストはそのままです!アイテムの数はここで違いはありません。

あなたが気にする必要があるのは、MyDataObjectclassで、structでない場合、リスト内のon項目のプロパティを変更すると、もう一方の項目が変更されます。例:

data[0].Foo = 12; 
Console.WriteLine(clonedList[0].Foo); // prints 12 

ただし、このコードではこれを実行していないようです。あなたが将来それに直面した場合に備えて、それを指摘してください。

+0

これをクリアしていただきありがとうございます:) –

関連する問題