2012-02-10 12 views
3

私はいつもこれについて混乱してきました。次のループを考える:.NETループの完全性101

int [] list = new int [] { 1, 2, 3 }; 
for (int i=0; i < list.Length; i++) { } 
foreach (int i in list) { } 
while (list.GetEnumerator().MoveNext()) { } // Yes, yes you wouldn't call GetEnumerator with the while. Actually never tried that. 
  • 【リスト】上記ハードコーディングされています。ループが繰り返し実行されている間にリストが外部で変更された場合、どうなりますか?
  • [list]が読み取り専用プロパティであった場合はどうなりますか? int List{get{return(new int [] {1,2,3});}}?これはループを狂わせるだろうか?そうでなければ、各反復で新しいインスタンスを作成しますか?

答えて

6

まあ:各反復でlist.Lengthに対して

  • forループチェック。実際にはループ内でlistにアクセスしないので、内容は変化しません。
  • foreachループでは、イテレータを取得するのにlistしか使用されません。別のリストを参照するように変更しても差はありませんが、リスト自体を構造的に変更した場合(例えば、値を追加してではなくList<int>)、イテレータを無効にします。
  • リストがクリアされない限り、書かれた例は永遠に続くでしょう、毎回新しいイテレータを得ることを考えれば、あなたはより多くの賢明な説明をしたい場合は、を指し

は基本的に変数をオブジェクト変化対配列の内容の違いを理解する必要があり、より賢明なコードを投稿し - して、私たちに非常にコンクリート状況を与えます説明する。しかし、一般的にforeachループは、イテレータをフェッチするときに、ソース式に一度だけ直接的に触れます。一方、forループには魔法がありません。また、アクセス頻度はコードに依存します。 forループの一部が各繰り返しで実行されるため、これらの部分のいずれかで変数を参照すると、変更が表示されます。

+1

もう1つのポイントは、配列の長さプロパティが不変。配列上で 'Length'を呼び出して特定の値を取得すると、その配列の' Length'への今後の呼び出しはすべて同じ値を返すことが保証されます。もちろん、インスタンス変数が配列型で、そのインスタンス変数が別の配列を指すように変更すると、その配列の長さは以前のものと異なる場合があります。 – supercat

関連する問題