回答編集履歴

1 typo

Chironian

Chironian score 22553

2016/06/18 23:02  投稿

こんにちは。
C#のクラスは参照型ですので単純に代入した場合、単にそのアドレスが代入されるだけです。
List<T>のaddはそれと同じ動作しますので、単にsampleのアドレスがリストへ追加されるだけなのです。
List<T>のaddは代入と同じ動作をするようですので、単にsampleのアドレスがリストへ追加されるだけなのです。
従って、SampleList.add(sample);を3回実行した場合、sampleのアドレスを3つSampleListへ追加されます。つまり、全部同じインスタンスへの参照(ポインタ)が設定されます。
従って、SampleListの要素を全て表示した場合、最後にsampleに設定した値が常に表示されます。
[MSDNのサンプル](https://msdn.microsoft.com/ja-jp/library/3wcytfd1(v=vs.110).aspx)のように、newしたものをadd()しましょう。それにより異なるdata_sampleのインスタンスが追加されます。
---
【余談ですが】
C#は、Javaと同じくポインタを意識しないで済む文法になっていますが、実装はポインタを使ってますので、ポインタを理解していないと今回のようなトラブルを解決することが厳しいです。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る