ในการตอบคำถาม "ทำไม" ถึงเป็นสาเหตุที่ไม่List<T>
เหตุผลคือการพิสูจน์ในอนาคตและความเรียบง่ายของ API
อนาคตพิสูจน์อักษร
List<T>
ไม่ได้ออกแบบมาให้สามารถขยายได้อย่างง่ายดายโดยการ subclassing มันถูกออกแบบมาให้รวดเร็วสำหรับการใช้งานภายใน คุณจะสังเกตเห็นว่าวิธีการนั้นไม่ใช่แบบเสมือนดังนั้นจึงไม่สามารถเขียนทับได้และไม่มี hooks ในAdd
/ Insert
/ Remove
การทำงาน
ซึ่งหมายความว่าหากคุณจำเป็นต้องเปลี่ยนพฤติกรรมของคอลเลกชันในอนาคต (เช่นการปฏิเสธวัตถุว่างเปล่าที่ผู้คนพยายามเพิ่มหรือเพื่อทำงานเพิ่มเติมเมื่อสิ่งนี้เกิดขึ้นเช่นการอัพเดทสถานะคลาสของคุณ) คุณต้องเปลี่ยนประเภท ของคอลเลกชันคุณกลับไปเป็นคลาสที่คุณสามารถ subclass ซึ่งจะเป็นการเปลี่ยนแปลงอินเตอร์เฟสที่แตกหัก (แน่นอนว่าการเปลี่ยนซีแมนทิกส์ของสิ่งต่าง ๆ เช่นไม่อนุญาตให้มี null อาจเป็นการเปลี่ยนอินเตอร์เฟส แต่สิ่งต่าง ๆ เช่นการอัปเดตคลาสภายใน
ดังนั้นโดยกลับทั้งระดับที่สามารถ subclassed ได้อย่างง่ายดายเช่นCollection<T>
หรืออินเตอร์เฟซเช่นIList<T>
, ICollection<T>
หรือIEnumerable<T>
คุณสามารถเปลี่ยนการดำเนินการภายในของคุณจะเป็นประเภทคอลเลกชันที่แตกต่างกันเพื่อตอบสนองความต้องการของคุณโดยไม่ทำลายรหัสของผู้บริโภคเพราะมันยังสามารถกลับมาเป็น ประเภทที่พวกเขาคาดหวัง
API Simplicity
List<T>
มีจำนวนมากของการดำเนินงานที่มีประโยชน์เช่นBinarySearch
, Sort
และอื่น ๆ อย่างไรก็ตามหากนี่เป็นคอลเล็กชันที่คุณเปิดเผยคุณอาจควบคุมความหมายของรายการไม่ใช่ผู้บริโภค ดังนั้นในขณะที่ชั้นเรียนของคุณอาจต้องใช้การดำเนินการเหล่านี้เป็นไปได้ยากที่ผู้บริโภคในชั้นเรียนของคุณต้องการที่จะเรียกพวกเขา
ด้วยการเสนอคลาสคอลเลกชันหรืออินเทอร์เฟซที่ง่ายขึ้นคุณจะลดจำนวนสมาชิกที่ผู้ใช้ API เห็นและทำให้ง่ายต่อการใช้งาน