ここ (VS2005 および C#2.0) には、以前のエンジニアが作成したすべてのコードのlist.ForEach( delegate(item) { foo;});代わりに使用するために道に迷ったコードがいくつかありました。foreach(item in list) {foo; };たとえば、dataReader から行を読み取るためのコードのブロックです。
なぜ彼らがこれをしたのか、私はまだ正確にはわかりません。
の欠点は次のlist.ForEach()とおりです。
C# 2.0 ではより冗長です。ただし、C# 3 以降では、" =>" 構文を使用して簡潔な式を作成できます。
あまりなじみがありません。このコードを保守しなければならない人は、なぜそのようにしたのか不思議に思うでしょう。理由はないと判断するのにしばらく時間がかかりましたが、おそらくライターを賢く見せるためでした (残りのコードの品質がそれを台無しにしていました)。また})、デリゲート コード ブロックの最後に " " があるため、読みづらくもありました。
Bill Wagner の著書「Effective C#: 50 Specific Ways to Improvement Your C#」も参照してください。ここでは、 foreach が for ループや while ループなどの他のループよりも好まれる理由について説明しています。ループ。コンパイラの将来のバージョンがより高速な手法を使用できるようになった場合、コードを変更するのではなく、foreach と再構築を使用することで無料でこれを取得できます。
反復またはループを終了する必要がある場合は、foreach(item in list)コンストラクトを使用してbreakorを使用できます。continueただし、foreach ループ内でリストを変更することはできません。
list.ForEachそれが少し速いのを見て驚いています。しかし、それはおそらく全体でそれを使用する正当な理由ではありません。それは時期尚早の最適化です。アプリケーションがループ制御ではなく、データベースまたは Web サービスを使用している場合、ほとんどの場合、時間はかかります。forまた、ループに対してもベンチマークしましたか? それlist.ForEachを内部的に使用することでより高速になる可能性がありfor、ラッパーのないループはさらに高速になります。
list.ForEach(delegate)バージョンが重要な意味で「より機能的」であることに同意しません。関数を関数に渡しますが、結果やプログラムの構成に大きな違いはありません。
foreach(item in list)私はそれが「あなたがやりたいことを正確に言っている」とは思いません-for(int 1 = 0; i < count; i++)ループはそれを行い、foreachループは制御の選択をコンパイラーに任せます。
新しいプロジェクトでは、C# 3 " " 演算子を使用して何かをよりエレガントまたはコンパクトに実行できる場合はforeach(item in list)、一般的な使用法と読みやすさを守るためにほとんどのループに使用し、短いブロックにのみ使用するように感じています。そのような場合、より具体的な LINQ 拡張メソッドが既に存在している可能性があります。、、、、または他の多くの LINQ メソッドのいずれかが、ループから必要な処理をまだ実行していないかどうかを確認します。list.Foreach()=>ForEach()Where()Select()Any()All()Max()