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