4
มีเหตุผลสำหรับการใช้ตัวแปร C # ซ้ำใน foreach หรือไม่?
เมื่อใช้แลมบ์ดานิพจน์หรือวิธีที่ไม่ระบุตัวตนใน C # เราต้องระวังการเข้าถึงหลุมพรางปิดที่มีการแก้ไข ตัวอย่างเช่น: foreach (var s in strings) { query = query.Where(i => i.Prop == s); // access to modified closure ... } เนื่องจากการปิดการปรับเปลี่ยนรหัสดังกล่าวข้างต้นจะทำให้ทั้งหมดของคำสั่งในการค้นหาให้เป็นไปตามค่าสุดท้ายของWheres ดังที่อธิบายไว้ที่นี่สิ่งนี้เกิดขึ้นเพราะsตัวแปรที่ประกาศในforeachลูปด้านบนถูกแปลเช่นนี้ในคอมไพเลอร์: string s; while (enumerator.MoveNext()) { s = enumerator.Current; ... } แทนที่จะเป็นเช่นนี้: while (enumerator.MoveNext()) { string s; s = enumerator.Current; ... } ดังที่กล่าวไว้ที่นี่ไม่มีข้อได้เปรียบด้านประสิทธิภาพในการประกาศตัวแปรภายนอกลูปและภายใต้สถานการณ์ปกติเหตุผลเดียวที่ฉันคิดได้สำหรับการทำเช่นนี้คือถ้าคุณวางแผนที่จะใช้ตัวแปรนอกขอบเขตของลูป: string …