ValueTask<T>
ไม่ได้เป็นส่วนหนึ่งของTask<T>
มันเป็นซูเปอร์
ValueTask<T>
เป็นสหภาพที่แยกออกจากกันของ T และ a Task<T>
ทำให้ปราศจากการจัดสรรสำหรับReadAsync<T>
การคืนค่า T ที่มีให้พร้อมกัน (ตรงกันข้ามกับการใช้Task.FromResult<T>
ซึ่งจำเป็นต้องจัดสรรTask<T>
อินสแตนซ์) ValueTask<T>
เป็น awaitable Task<T>
เพื่อการบริโภคส่วนใหญ่ของกรณีจะแตกต่างจากที่มี
ValueTask เป็นโครงสร้างช่วยให้สามารถเขียนวิธีการ async ที่ไม่จัดสรรหน่วยความจำเมื่อพวกเขาทำงานพร้อมกันโดยไม่สูญเสียความสอดคล้องของ API ลองนึกภาพว่ามีส่วนต่อประสานกับวิธีการส่งคืนงาน แต่ละคลาสที่ใช้อินเทอร์เฟซนี้จะต้องส่งคืนภารกิจแม้ว่าจะเกิดการเรียกใช้งานพร้อมกัน (หวังว่าจะใช้ Task.FromResult) แน่นอนคุณสามารถมี 2 วิธีที่แตกต่างกันบนอินเทอร์เฟซหนึ่งแบบซิงโครนัสและแบบอะซิงโครนัส แต่สิ่งนี้ต้องการการใช้งานที่แตกต่างกัน 2 แบบเพื่อหลีกเลี่ยง "ซิงค์ผ่าน async" และ "
ดังนั้นให้คุณเขียนวิธีหนึ่งที่ไม่ตรงกันหรือแบบซิงโครนัสแทนที่จะเขียนวิธีใดวิธีหนึ่งที่เหมือนกันสำหรับแต่ละวิธี คุณสามารถใช้งานได้ทุกที่Task<T>
แต่มักจะไม่เพิ่มอะไรเลย
มันเพิ่มสิ่งหนึ่ง: เพิ่มสัญญาโดยนัยแก่ผู้เรียกว่าวิธีการใช้ฟังก์ชันการทำงานเพิ่มเติมที่ValueTask<T>
ให้ไว้จริง ๆ ฉันเองชอบเลือกพารามิเตอร์และประเภทกลับที่บอกผู้โทรให้มากที่สุด อย่าส่งคืนIList<T>
หากการแจงนับไม่สามารถนับได้ อย่าส่งคืนIEnumerable<T>
ถ้าทำได้ ผู้บริโภคของคุณไม่จำเป็นต้องค้นหาเอกสารใด ๆ เพื่อทราบว่าวิธีการใดของคุณที่สามารถเรียกได้ว่าเหมาะสมและไม่สามารถทำได้
ฉันไม่เห็นการเปลี่ยนแปลงการออกแบบในอนาคตเป็นข้อโต้แย้งที่น่าเชื่อถือ ค่อนข้างตรงกันข้าม: หากวิธีการเปลี่ยนความหมายของมันก็ควรทำลายการสร้างจนสายทั้งหมดที่มีการปรับปรุงตาม หากพิจารณาว่าเป็นสิ่งที่ไม่พึงประสงค์ (และเชื่อฉันฉันก็เห็นใจต่อความปรารถนาที่จะไม่ทำลายงานสร้าง) พิจารณาเวอร์ชันของอินเทอร์เฟซ
นี่คือสิ่งที่สำคัญสำหรับการพิมพ์ที่แข็งแกร่ง
หากโปรแกรมเมอร์บางคนออกแบบวิธีการซิงค์ในร้านค้าของคุณไม่สามารถตัดสินใจอย่างชาญฉลาดอาจเป็นประโยชน์ในการกำหนดพี่เลี้ยงอาวุโสให้กับโปรแกรมเมอร์ที่มีประสบการณ์น้อยแต่ละคนและมีการทบทวนรหัสประจำสัปดาห์ หากพวกเขาเดาผิดให้อธิบายว่าทำไมมันควรทำแตกต่างกัน มันเป็นค่าใช้จ่ายสำหรับคนอาวุโส แต่มันจะทำให้จูเนียร์เร็วขึ้นเร็วกว่าการโยนพวกเขาลงไปในก้นบึ้งและให้กฎเกณฑ์แก่พวกเขาตามอำเภอใจ
ถ้าคนที่เขียนวิธีการนั้นไม่รู้ว่าสามารถเรียกมันแบบซิงโครนัสได้ใครในโลกบ้าง!
หากคุณมีโปรแกรมเมอร์ที่ไม่มีประสบการณ์หลายคนที่เขียนวิธีการแบบอะซิงก์คนเหล่านั้นก็เรียกพวกเขาด้วยเช่นกัน? พวกเขามีคุณสมบัติที่จะคิดออกเองว่าตัวไหนปลอดภัยที่จะเรียก async หรือพวกเขาจะเริ่มใช้กฎเกณฑ์ที่คล้ายคลึงกันกับวิธีที่พวกเขาเรียกสิ่งเหล่านี้หรือไม่?
ปัญหาที่นี่ไม่ใช่ประเภทการคืนสินค้าของคุณ แต่เป็นโปรแกรมเมอร์ที่มีบทบาทที่ไม่พร้อม นั่นต้องเกิดขึ้นด้วยเหตุผลดังนั้นฉันแน่ใจว่ามันไม่สามารถแก้ไขได้เล็กน้อย การอธิบายอย่างแน่นอนไม่ใช่วิธีแก้ปัญหา แต่กำลังมองหาวิธีที่จะแอบดูปัญหาที่ผ่านมาคอมไพเลอร์ก็ไม่ใช่ทางแก้ปัญหาเช่นกัน
ValueTask<T>
(ในแง่ของการจัดสรร) ไม่เป็นรูปธรรมสำหรับการดำเนินการที่ไม่ตรงกันจริง ๆ (เพราะในกรณีValueTask<T>
นั้นจะยังคงต้องการการจัดสรรฮีป) นอกจากนี้ยังมีเรื่องของTask<T>
การมีการสนับสนุนอื่น ๆ อีกมากมายภายในห้องสมุด