for-ifアンチパターンについてこのブログ投稿を読んでいましたが、なぜそれがアンチパターンであるのか理解できません。
foreach (string filename in Directory.GetFiles("."))
{
    if (filename.Equals("desktop.ini", StringComparison.OrdinalIgnoreCase))
    {
        return new StreamReader(filename);
    }
}
質問1:
それが理由であるreturn new StreamReader(filename);内部for loop?または、forこの場合ループが必要ないという事実ですか?
ブログの作者が指摘したように、これのクレイジーでないバージョンは次のとおりです:
if (File.Exists("desktop.ini"))
{
    return new StreamReader("desktop.ini");
} 
の作成前にファイルが削除されるとStreamReader、を取得するため、どちらも競合状態になりますFileNotFoundException。
質問2:
2番目の例を修正するには、ifステートメントなしで書き直し、代わりにをStreamReadertry-catchブロックで囲み、それがスローされるFileNotFoundException場合は、それにcatch応じてブロックで処理しますか?
To fix the second example, would you re-write it without the if statement, and instead surround the StreamReader with a try-catch block, and if it throws a FileNotFoundException you handle it in the catch block accordingly?-はい、それはまさに私がすることです。競合状態を解決することは、「制御フローとしての例外」という概念よりも重要であり、エレガントかつクリーンに解決します。
                nullますか?通常、LINQを使用して、例のコードのようなコードをクリーンアップできます。2つのLINQ呼び出しの間の演算子にreturn Directory.GetFiles(".").FirstOrDefault(fileName => fileName.Equals("desktop.ini", StringComparison.OrdinalIgnoreCase))?.Select(fileName => new StreamReader(filename));  注意してください?.。また、人々は、このようなオブジェクトの作成はLINQの最も適切な使用法ではないと主張するかもしれませんが、ここでは問題ないと思います。これはあなたの質問への答えではありませんが、その一部について余談です。