นี่คือคำหลัก C # ให้ผลตอบแทนในการดำเนินการ - มันไม่ได้ทำอะไรเป็นพิเศษกับwww
วัตถุ แต่มันหมายถึงสิ่งที่พิเศษสำหรับวิธีการที่มีอยู่โดยเฉพาะคำหลักนี้สามารถใช้ได้เฉพาะในวิธีการที่ส่งกลับIEnumerable
(หรือIEnumerator
) และใช้ เพื่อระบุว่าวัตถุใดที่จะ "คืนค่า" โดยตัวแจงนับเมื่อมีการเรียกใช้MoveNext
มันทำงานได้เพราะคอมไพเลอร์แปลงวิธีทั้งหมดเป็นคลาสแยกซึ่งใช้IEnumerable
(หรือIEnumerator
) โดยใช้เครื่องสถานะ - ผลสุทธิคือว่าร่างกายของวิธีการที่ตัวเองไม่ได้ดำเนินการจนกว่าจะมีคนระบุผ่านค่าตอบแทน มันจะใช้งานได้กับทุกประเภทไม่มีอะไรพิเศษเกี่ยวกับWWW
วิธีการบรรจุที่พิเศษ
ดูเบื้องหลังของคำสำคัญผลตอบแทน C #สำหรับข้อมูลเชิงลึกเพิ่มเติมเกี่ยวกับประเภทของโค้ดคอมไพเลอร์ C # ที่สร้างขึ้นหรือเพียงแค่ทดสอบและตรวจสอบโค้ดด้วยตัวคุณเองโดยใช้IL Spy
อัปเดต:เพื่อชี้แจง
- เมื่อ Unity เรียก coroutine ที่มี
yield return
คำสั่งทั้งหมดที่เกิดขึ้นคือ enumerator ถูกส่งกลับ - ไม่มีเนื้อความของเมธอดใดถูกดำเนินการ ณ จุดนี้
- ในการรับส่วนของเมธอดเพื่อเรียกใช้ Unity ต้องเรียก
MoveNext
ใช้ตัววนซ้ำเพื่อรับค่าแรกในลำดับ สิ่งนี้ทำให้วิธีการดำเนินการถึงyeild return
คำสั่งแรกที่จุดที่ผู้โทรกลับมาดำเนินการต่อ (และ Unity สันนิษฐานไปเพื่อแสดงส่วนที่เหลือของเฟรม)
- ตามที่ฉันเข้าใจว่า Unity ปกติแล้วจะเรียก
MoveNext
วิธีการในตัววนซ้ำแต่ละเฟรมที่ตามมาทำให้วิธีการดำเนินการอีกครั้งถึงyield return
คำสั่งถัดไปหนึ่งครั้งในแต่ละเฟรมจนกว่าจะถึงจุดสิ้นสุดของวิธีการหรือyield break
คำสั่งถึง (ระบุ จุดสิ้นสุดของลำดับ)
บิตเท่านั้นพิเศษที่นี่ (และในคู่ของกรณีอื่น ๆ ) ก็คือความสามัคคีไม่ก้าวหน้า iterator นี้โดยเฉพาะเฟรมถัดไปแทนก็เพียงความก้าวหน้า iterator (ที่ก่อให้เกิดวิธีการที่จะยังคงดำเนินการ) เมื่อการดาวน์โหลดเสร็จสมบูรณ์ แม้ว่าดูเหมือนจะเป็นคลาสYieldInstructionพื้นฐานซึ่งน่าจะมีกลไกทั่วไปสำหรับการส่งสัญญาณไปยัง Unity เมื่อ iterator ควรสูงขึ้นWWW
คลาสไม่ปรากฏว่าสืบทอดมาจากคลาสนี้ดังนั้นฉันสามารถสันนิษฐานได้ว่ามีกรณีพิเศษสำหรับ คลาสนี้ในเอ็นจิน Unity
เพื่อให้ชัดเจน - yield
คำหลักไม่ได้ทำอะไรเป็นพิเศษในWWW
ชั้นเรียน แต่เป็นการจัดการพิเศษที่ Unity มอบให้กับสมาชิกของการแจงนับที่ส่งคืนซึ่งทำให้เกิดลักษณะการทำงานนี้
อัปเดตที่สอง:สำหรับกลไกที่WWW
ใช้ในการดาวน์โหลดหน้าเว็บแบบอะซิงโครนัสมันอาจใช้วิธีการ HttpWebRequest.BeginGetResponseซึ่งจะใช้ภายในแบบอะซิงโครนัส IOหรืออาจใช้เธรด (โดยเฉพาะการสร้างเธรดเฉพาะ
yield return
สำหรับการดำเนินการแบบอะซิงโครนัสคือแฮ็ค ในโปรแกรม "ของจริง" C # คุณต้องใช้โปรแกรมTask
นี้ ความสามัคคีอาจไม่ได้ใช้เพราะมันถูกสร้างขึ้นก่อน. Net 4.0 เมื่อTask
ถูกนำมาใช้