3

私はいつもこれについて混乱していました。次のループを検討してください。

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});}}か? これはループを混乱させますか。そうでない場合、各反復で新しいインスタンスを作成しますか?
4

1 に答える 1

6

良い:

  • ループは反復ごとにforチェックします。ループ内でlist.Length実際にアクセスするわけではないので、内容は関係ありませんlist
  • foreachループは反復子を取得するためにのみ使用しlistます。別のリストを参照するように変更しても違いはありませんが、リスト自体を構造的に変更した場合 (たとえば、これが本当にList<int>ではなく であった場合に値を追加することによってint[])、イテレータが無効になります。
  • 書かれている 3 番目の例は、毎回新しいイテレータを取得することを考えると、リストがクリアされない限り永遠に続きます。より賢明な説明が必要な場合は、より賢明なコードを投稿してください

基本的に、配列の内容と変数が参照するオブジェクトの変更との違いを理解する必要があります。次に、非常に具体的な状況を説明してください。ただし、一般に、foreachループはイテレータをフェッチするときに一度だけソース式に直接触れます-forループには魔法がなく、アクセスされる頻度は単にコードに依存します-条件と「ステップ」部分の両方ループはfor反復ごとに実行されるため、これらの部分のいずれかで変数を参照すると、変更が表示されます...

于 2012-02-10T19:13:36.523 に答える