บางครั้งฉันต้องเขียนวิธีหรือคุณสมบัติสำหรับไลบรารี่คลาสที่ไม่ได้ยอดเยี่ยมที่จะไม่มีคำตอบจริง แต่เป็นความล้มเหลว ไม่สามารถระบุบางสิ่ง, ไม่พร้อมใช้, ไม่พบ, ไม่สามารถทำได้ในปัจจุบันหรือไม่มีข้อมูลเพิ่มเติม
ฉันคิดว่ามีวิธีแก้ปัญหาสามประการที่เป็นไปได้สำหรับสถานการณ์ที่ไม่เป็นพิเศษเช่นนี้เพื่อระบุความล้มเหลวใน 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
มีอยู่