คำถามที่ 1:
เป็นเพราะการคืน StreamReader ใหม่ (ชื่อไฟล์); ภายในสำหรับวง? หรือความจริงที่ว่าคุณไม่ต้องการลูปสำหรับกรณีนี้
สตรีมไม่มีอะไรเกี่ยวข้องกับมัน รูปแบบการต่อต้านเกิดขึ้นเนื่องจากความขัดแย้งระหว่างเจตนาforeach
และif
:
วัตถุประสงค์ของการforeach
คืออะไร?
ฉันคิดว่าคำตอบของคุณจะเป็นเช่น: "ฉันต้องการรันโค้ดบางส่วนซ้ำ ๆ "
คุณคาดว่าจะประมวลผลไฟล์กี่ไฟล์?
เนื่องจากคุณสามารถมีได้เพียงเฉพาะชื่อไฟล์หนึ่ง (รวมส่วนขยาย) โดยเฉพาะอย่างยิ่งในโฟลเดอร์นี้พิสูจน์ให้เห็นว่ารหัสของคุณมีจุดมุ่งหมายเพื่อหาหนึ่งไฟล์บังคับ
นี่คือการยืนยันโดยความจริงที่ว่าคุณจะคืนค่าทันที คุณไม่สนใจเกี่ยวกับนัดที่สองแม้ว่ามันจะมีอยู่จริง
มีสถานการณ์ที่นี่ไม่ใช่รูปแบบการต่อต้าน
- หากคุณดูในไดเรกทอรีย่อย (
Directory.GetFiles(".", SearchOption.AllDirectories)
) ก็เป็นไปได้ที่จะค้นหามากกว่าหนึ่งไฟล์ที่มีชื่อไฟล์เดียวกัน (รวมถึงนามสกุล)
- หากคุณค้นหาชื่อไฟล์ที่ตรงกันบางส่วน (เช่นทุกไฟล์ที่ชื่อขึ้นต้นด้วย
"Test_"
หรือทุก"*.zip"
ไฟล์
โปรดทราบว่าทั้งสองกรณีนี้จะทำให้คุณต้องประมวลผลการแข่งขันหลายรายการดังนั้นจึงไม่ส่งคืนค่าทันที
คำถามที่ 2:
ในการแก้ไขตัวอย่างที่สองคุณจะเขียนใหม่โดยไม่มีคำสั่ง if และแทนที่ StreamReader ด้วยบล็อก try-catch แทนและถ้ามันโยน FileNotFoundException คุณจัดการมันใน catch block ตามนั้นหรือไม่
ข้อยกเว้นมีราคาแพง พวกเขาไม่ควรใช้แทนตรรกะการไหลที่เหมาะสม มีข้อยกเว้นตามชื่อของพวกเขาแนะนำสถานการณ์พิเศษ
if
สำหรับเหตุผลที่คุณไม่ควรเอา
ตามคำตอบนี้ใน SoftwareEngineering.SE :
โดยทั่วไปการใช้ข้อยกเว้นสำหรับการควบคุมการไหลเป็นรูปแบบการต่อต้านที่มีสถานการณ์ที่น่าทึ่ง - และข้อยกเว้นเฉพาะไอภาษาที่โดดเด่น
สรุปโดยย่อสำหรับสาเหตุโดยทั่วไปเป็นรูปแบบการต่อต้าน:
- โดยพื้นฐานแล้วข้อยกเว้นของ GOTO นั้นมีความซับซ้อน
- การเขียนโปรแกรมที่มีข้อยกเว้นทำให้การอ่านและทำความเข้าใจโค้ดยากขึ้น
- ภาษาส่วนใหญ่มีโครงสร้างการควบคุมที่มีอยู่ซึ่งออกแบบมาเพื่อแก้ปัญหาของคุณโดยไม่ต้องใช้ข้อยกเว้น
- ข้อโต้แย้งสำหรับประสิทธิภาพมักจะเป็นที่ถกเถียงสำหรับคอมไพเลอร์สมัยใหม่ซึ่งมีแนวโน้มที่จะปรับให้เหมาะสมกับสมมติฐานที่ว่าข้อยกเว้นที่ไม่ได้ใช้สำหรับการควบคุมการไหล
อ่านการสนทนาที่wiki ของ Wardเพื่อดูข้อมูลเชิงลึกเพิ่มเติม
ไม่ว่าคุณจะต้องการสรุปในการลอง / จับขึ้นอยู่กับสถานการณ์ของคุณ:
- มีโอกาสเป็นไปได้มากแค่ไหนที่คุณจะต้องเผชิญกับสภาพการแข่งขัน?
- คุณสามารถจัดการกับสถานการณ์นี้ได้จริงหรือคุณต้องการให้ปัญหานี้เกิดขึ้นกับผู้ใช้เนื่องจากคุณไม่ทราบวิธีจัดการกับปัญหา
ไม่มีสิ่งใดเป็นเรื่องของ "ใช้งานได้เสมอ" เพื่อพิสูจน์ประเด็นของฉัน:
การศึกษาแยกได้พิสูจน์ว่าคุณมีโอกาสน้อยที่จะได้รับบาดเจ็บเมื่อคุณสวมหมวกนิรภัย, แว่นตานิรภัยและเสื้อกันกระสุน
เหตุใดเราจึงไม่สวมอุปกรณ์ความปลอดภัยนี้ตลอดเวลา
คำตอบง่ายๆคือเพราะมีข้อเสียในการสวมใส่:
- ค่าใช้จ่ายเงิน
- มันทำให้การเคลื่อนไหวของคุณยุ่งยากมากขึ้น
- มันค่อนข้างอบอุ่นที่จะสวมใส่
ตอนนี้เรากำลังได้รับบาง: มีโปรและข้อเสีย กล่าวอีกอย่างหนึ่งก็คือมันสมเหตุสมผลที่จะสวมใส่อุปกรณ์นี้ในกรณีที่มืออาชีพมีน้ำหนักเกินข้อเสีย
- คนงานก่อสร้างมีแนวโน้มที่จะได้รับบาดเจ็บระหว่างทำงาน พวกเขาได้รับประโยชน์จากหมวกนิรภัย
- ในทางกลับกันคนงานออฟฟิศมีโอกาสได้รับบาดเจ็บน้อยกว่ามาก หมวกนิรภัยไม่คุ้มค่า
- สมาชิกทีมหน่วย SWAT มีแนวโน้มที่จะถูกยิงได้มากกว่าเมื่อเปรียบเทียบกับพนักงานออฟฟิศ
คุณควรปิดการโทรด้วยการลอง / จับ สิ่งนั้นขึ้นอยู่กับว่าประโยชน์ของการทำนั้นมีมากกว่าค่าใช้จ่ายในการดำเนินการหรือไม่
โปรดทราบว่าคนอื่นอาจโต้แย้งว่าใช้เวลาเพียงไม่กี่ครั้งในการปิดล้อมดังนั้นจึงควรทำอย่างชัดเจน แต่นั่นไม่ใช่เหตุผลทั้งหมด:
- คุณต้องตัดสินใจว่าจะทำอย่างไรเมื่อคุณได้รับการยกเว้น
- หากมีจำนวนมากของสายที่แตกต่างกันไปยังไฟล์ที่แตกต่างกันทั่ว codebase ที่ตัดสินใจที่จะห่อหนึ่งในลอง / จับโดยทั่วไปจะหมายถึงว่าคุณต้องตัดทุกกรณีเหล่านี้ สิ่งนี้สามารถมีผลอย่างมากต่อจำนวนความพยายามที่จำเป็นในการใช้
- เป็นไปได้อย่างสมบูรณ์แบบที่คุณตั้งใจจะไม่จัดการกับข้อยกเว้น
- โปรดทราบว่าแอปพลิเคชันของคุณจะต้องจัดการกับข้อยกเว้นในบางจุด แต่ไม่จำเป็นทันทีหลังจากยกข้อยกเว้น
ดังนั้นทางเลือกเป็นของคุณ มีประโยชน์ไหมที่จะทำเช่นนั้น? คุณคิดว่ามันช่วยปรับปรุงแอปพลิเคชั่นมากกว่าความพยายามที่จะคิดค่าใช้จ่ายหรือไม่
อัปเดต - จากความคิดเห็นที่ฉันเขียนไปยังคำตอบอื่น ๆ เนื่องจากฉันคิดว่ามันเป็นข้อพิจารณาที่เกี่ยวข้องสำหรับคุณเช่นกัน:
มันบานพับมากในบริบทโดยรอบ
- หากการเปิดตัวของการ StreamReader จะนำหน้าด้วย
if(!File.Exists) File.Create()
แล้วกรณีที่ไม่มีแฟ้มเมื่อเปิด StreamReader ย่อมเป็นพิเศษ
- ถ้าชื่อไฟล์ที่ถูกเลือกจากรายชื่อของไฟล์ที่มีอยู่ขาดอย่างฉับพลันของมันเป็นอีกครั้งที่ได้รับการยกเว้น
- หากคุณทำงานกับสตริงที่คุณยังไม่ได้ทดสอบกับไดเรกทอรีจริงๆ แล้วกรณีที่ไม่มีของไฟล์ที่เป็นผลเชิงตรรกะที่ดีเลิศและดังนั้นจึงไม่ได้รับการยกเว้น