บางครั้งฉันต้องเขียนวิธีหรือคุณสมบัติสำหรับไลบรารี่คลาสที่ไม่ได้ยอดเยี่ยมที่จะไม่มีคำตอบจริง แต่เป็นความล้มเหลว ไม่สามารถระบุบางสิ่ง, ไม่พร้อมใช้, ไม่พบ, ไม่สามารถทำได้ในปัจจุบันหรือไม่มีข้อมูลเพิ่มเติม
ฉันคิดว่ามีวิธีแก้ปัญหาสามประการที่เป็นไปได้สำหรับสถานการณ์ที่ไม่เป็นพิเศษเช่นนี้เพื่อระบุความล้มเหลวใน C # 4:
- คืนค่าเวทย์มนตร์ที่ไม่มีความหมายเป็นอย่างอื่น (เช่น
nullและ-1); - โยนข้อยกเว้น (เช่น
KeyNotFoundException); - ส่งคืน
falseและระบุค่าส่งคืนจริงในoutพารามิเตอร์ (เช่นDictionary<,>.TryGetValue)
ดังนั้นคำถามคือ: ในสถานการณ์ใดที่ฉันไม่ควรพลาด และถ้าฉันไม่ควรโยน: เมื่อส่งคืนค่าเวทมนตร์ที่อ้างถึงข้างต้นใช้Try*วิธีการที่มีoutพารามิเตอร์หรือไม่ (สำหรับฉันoutพารามิเตอร์ดูเหมือนว่าสกปรกและใช้งานได้อย่างถูกต้องมากกว่า)
ฉันกำลังมองหาคำตอบที่เป็นจริงเช่นคำตอบที่เกี่ยวข้องกับแนวทางการออกแบบ (ฉันไม่รู้อะไรเกี่ยวกับTry*วิธีการ) ความสามารถในการใช้งาน (เมื่อฉันขอสิ่งนี้สำหรับห้องสมุดคลาส) ความสอดคล้องกับ BCL และความสามารถในการอ่าน
ในไลบรารีคลาสพื้นฐาน. NET Framework ใช้วิธีการทั้งสาม:
- คืนค่าเวทย์มนตร์ที่ไม่มีความหมายเป็นอย่างอื่น:
Collection<T>.IndexOfผลตอบแทน -1StreamReader.Readผลตอบแทน -1Math.Sqrtส่งกลับ NaNHashtable.Itemผลตอบแทนที่เป็นโมฆะ;
- โยนข้อยกเว้น:
Dictionary<,>.Itemพ่น KeyNotFoundExceptionDouble.Parseพ่น FormatException; หรือ
- ส่งคืน
falseและระบุค่าส่งคืนจริงในoutพารามิเตอร์:
โปรดทราบว่าตามที่Hashtableถูกสร้างขึ้นในเวลาที่ไม่มี generics ใน C # จะใช้objectและสามารถกลับnullเป็นค่าเวทย์มนตร์ แต่ด้วย generics ข้อยกเว้นจะใช้ในต้นและมันไม่ได้มีDictionary<,> TryGetValueเห็นได้ชัดว่าการเปลี่ยนแปลงข้อมูลเชิงลึก
เห็นได้ชัดว่าItem- TryGetValueและParse- TryParseคู่คือมีเหตุผลดังนั้นฉันคิดว่าการขว้างปาข้อยกเว้นสำหรับความล้มเหลวที่ไม่ได้โดดเด่นอยู่ใน C # 4 ไม่ได้ทำ อย่างไรก็ตามTry*วิธีการไม่ได้มีอยู่เสมอแม้จะDictionary<,>.Itemมีอยู่