Đây là từ khóa năng suất C # đang hoạt động - nó không làm gì đặc biệt với www
đối tượng, mà nó có nghĩa là một cái gì đó đặc biệt cho phương thức mà nó chứa trong đó. Cụ thể từ khóa này chỉ có thể được sử dụng trong một phương thức trả về một IEnumerable
(hoặc IEnumerator
) và được sử dụng để cho biết đối tượng nào sẽ được "trả về" bởi điều tra viên khi MoveNext được gọi.
Nó hoạt động vì trình biên dịch chuyển đổi toàn bộ phương thức thành một lớp riêng biệt thực hiện IEnumerable
(hoặc IEnumerator
) bằng cách sử dụng máy trạng thái - kết quả thực tế là phần thân của phương thức không được thực thi cho đến khi có ai đó liệt kê giá trị trả về. Điều này sẽ làm việc với bất kỳ loại nào, hoàn toàn không có gì đặc biệt WWW
, thay vào đó là phương thức chứa đặc biệt.
Hãy xem Hậu trường của từ khóa năng suất C # để hiểu rõ hơn về loại mã mà trình biên dịch C # tạo ra, hoặc chỉ tự mình thử nghiệm và kiểm tra mã bằng cách sử dụng thứ gì đó như IL Spy
Cập nhật: Để làm rõ
- Khi Unity gọi một coroutine có chứa một
yield return
câu lệnh, tất cả những gì xảy ra là một điều tra viên được trả về - không có phần thân phương thức nào được thực thi tại thời điểm này
- Để có được phần thân phương thức thực thi, Unity phải gọi
MoveNext
iterator để lấy giá trị đầu tiên trong chuỗi. Điều này khiến phương thức thực thi đến yeild return
câu lệnh đầu tiên , tại đó người gọi tiếp tục lại (và có lẽ Unity tiếp tục hiển thị phần còn lại của khung)
- Theo tôi hiểu, Unity bình thường sau đó tiếp tục gọi
MoveNext
phương thức trên iterator một lần mỗi khung hình tiếp theo, khiến phương thức thực hiện lại cho yield return
câu lệnh tiếp theo một lần cho mỗi khung hình, cho đến khi kết thúc phương thức hoặc yield break
câu lệnh (đạt kết thúc chuỗi)
Bit chỉ đặc biệt ở đây (và trong một vài các trường hợp khác ) là Unity không tiến iterator đặc biệt này frame kế tiếp, thay vào đó nó chỉ tiến iterator (gây phương pháp để tiếp tục thực hiện) khi quá trình download hoàn thành. Mặc dù dường như có một lớp YieldInXD cơ sở có lẽ chứa một cơ chế chung để báo hiệu cho Unity khi một trình lặp được nâng cao, nhưng WWW
lớp này dường như không kế thừa từ lớp này vì vậy tôi chỉ có thể giả sử rằng có một trường hợp đặc biệt cho lớp này trong công cụ Unity.
Nói rõ hơn - yield
từ khóa không làm gì đặc biệt cho WWW
lớp, thay vào đó là cách xử lý đặc biệt mà Unity dành cho các thành viên của bảng liệt kê trả lại gây ra hành vi này.
Cập nhật lần thứ hai: Đối với cơ chế WWW
sử dụng để tải xuống các trang web không đồng bộ, nó có thể sử dụng Phương thức httpWebRequest.BeginGetResponse , trong đó sẽ sử dụng IO không đồng bộ hoặc thay vào đó, nó có thể sử dụng các luồng (hoặc tạo một luồng chuyên dụng) hoặc bằng cách sử dụng một luồng xử lý).
yield return
cho các hoạt động không đồng bộ là một hack. Trong chương trình C # "thực", bạn sẽ sử dụng một chương trìnhTask
này. Unity có thể không sử dụng chúng vì nó đã được tạo trước .Net 4.0, khiTask
được giới thiệu.